79 votes

ASP.NET MVC 4 intercepte toutes les demandes entrantes

Puis-je capturer toutes les demandes entrantes sur mon application ASP.NET MVC 4 et exécuter du code avant de poursuivre la demande sur le contrôleur / l'action spécifié?

Je dois exécuter du code d'autorisation personnalisé avec les services existants. Pour le faire correctement, je devrais être en mesure d'intercepter toutes les demandes entrantes de tous les clients afin de vérifier certaines choses avec l'autre service.

81voto

Yngve B. Nilsen Points 5785

La manière la plus correcte serait de créer une classe qui hérite de ActionFilterAttribute et de remplacer la méthode OnActionExecuting . Cela peut alors être enregistré dans les GlobalFilters en Global.asax.cs

Bien entendu, cela n'interceptera que les demandes qui ont réellement un itinéraire.

38voto

Mennan Kara Points 4008

Vous pouvez utiliser un HttpModule pour accomplir cela. Voici un exemple que j’utilise pour calculer le temps de traitement de toutes les demandes:

 using System;
using System.Diagnostics;
using System.Web;

namespace Sample.HttpModules
{
    public class PerformanceMonitorModule : IHttpModule
    {

        public void Init(HttpApplication httpApp)
        {
            httpApp.BeginRequest += OnBeginRequest;
            httpApp.EndRequest += OnEndRequest;
            httpApp.PreSendRequestHeaders += OnHeaderSent;
        }

        public void OnHeaderSent(object sender, EventArgs e)
        {
            var httpApp = (HttpApplication)sender;
            httpApp.Context.Items["HeadersSent"] = true;
        }

        // Record the time of the begin request event.
        public void OnBeginRequest(Object sender, EventArgs e)
        {
            var httpApp = (HttpApplication)sender;
            if (httpApp.Request.Path.StartsWith("/media/")) return;
            var timer = new Stopwatch();
            httpApp.Context.Items["Timer"] = timer;
            httpApp.Context.Items["HeadersSent"] = false;
            timer.Start();
        }

        public void OnEndRequest(Object sender, EventArgs e)
        {
            var httpApp = (HttpApplication)sender;
            if (httpApp.Request.Path.StartsWith("/media/")) return;
            var timer = (Stopwatch)httpApp.Context.Items["Timer"];

            if (timer != null)
            {
                timer.Stop();
                if (!(bool)httpApp.Context.Items["HeadersSent"])
                {
                    httpApp.Context.Response.AppendHeader("ProcessTime",
                                                          ((double)timer.ElapsedTicks / Stopwatch.Frequency) * 1000 +
                                                          " ms.");
                }
            }

            httpApp.Context.Items.Remove("Timer");
            httpApp.Context.Items.Remove("HeadersSent");

        }

        public void Dispose() { /* Not needed */ }
    }

}
 

Et voici comment vous enregistrez le module dans Web.Config:

 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="PerformanceMonitorModule" type="Sample.HttpModules.PerformanceMonitorModule" />
    </modules>
<//system.webServer>
 

25voto

user2173353 Points 369

Je pense que ce que vous recherchez est ceci:

 Application_BeginRequest()
 

http://www.dotnetcurry.com/showarticle.aspx?ID=126

Vous le mettez en Global.asax.cs .

     protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Request.....;
    }
 

J'utilise ceci à des fins de débogage mais je ne suis pas sûr de la qualité de la solution pour votre cas.

7voto

Draghon Points 81

Pas une réponse, mais une observation et pas assez de rep à tout commentaire.

Il y a une mise en garde qui n'est pas traitée (si Yngve points), mais il pourrait être important dans le choix de l'approche de vous accepter pour votre projet.

Une Action de Filtre (à partir de Yngve de réponse) est idéal si vous êtes seulement intéressés par les demandes de carte de contrôleurs de (et par conséquent, le code personnalisé est uniquement pertinent dans votre MVC solution et non pas dans la grande solution web/présence). Toutefois, pour répondre à TOUTES les demandes, un Module HTTP serait le mieux (comme Mennan répondu), comme il le ferait en sorte que le code personnalisé intercepter les requêtes, même si les clients ne font pas appel à un contrôleur; par exemple, vous avez créé un gestionnaire HTTP personnalisé dans votre application MVC (ou tout IIS-application hébergée) et vous avez besoin de quelques personnalisé logique d'autorisation à exécuter avant que le conducteur...c'est là que le module HTTP viendraient.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X