ASP.NET MVC 4 intercepte toutes les demandes entrantes

Est-il possible pour moi d’attraper toutes les demandes entrantes sur mon application ASP.NET MVC 4 et d’exécuter du code avant de poursuivre la demande vers le contrôleur / l’action spécifié?

Je dois exécuter du code d’authentification personnalisé avec les services existants et pour ce faire correctement, je devrai pouvoir intercepter toutes les demandes entrantes de tous les clients pour vérifier certaines choses avec l’autre service.

La manière la plus correcte serait de créer une classe qui hérite de ActionFilterAtsortingbute et remplace OnActionExecuting méthode OnActionExecuting . Cela peut ensuite être enregistré dans le GlobalFilters dans Global.asax.cs

Bien entendu, cela interceptera uniquement les requêtes qui ont réellement un itinéraire.

Vous pouvez utiliser un HttpModule pour cela. Voici un exemple que j’utilise pour calculer le temps de traitement pour 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 c’est comme ça que vous enregistrez le module dans Web.Config:

      

Je pense que ce que vous recherchez est la suivante:

 Application_BeginRequest() 

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

Vous l’avez mis dans Global.asax.cs .

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

Je l’utilise à des fins de débogage, mais je ne suis pas sûr de la qualité de la solution pour votre cas.

Je ne suis pas sûr de MVC4 mais je pense que c’est assez similaire à MVC5. Si vous avez créé un nouveau projet Web -> regardez dans Global.asax et vous devriez voir la ligne suivante FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); dans la méthode Application_Start() .

RegisterGlobalFilters est une méthode du fichier FilterConfig.cs située dans le dossier App_Start .

Comme @ YngveB-Nilsen a déclaré ActionFilterAtsortingbute est la voie à suivre à mon avis. Ajoutez une nouvelle classe System.Web.Mvc.ActionFilterAtsortingbute de System.Web.Mvc.ActionFilterAtsortingbute . Ceci est important car System.Web.Http.Filters.ActionFilterAtsortingbute échouera avec l’exception suivante, par exemple.

L’instance de filtre donnée doit implémenter une ou plusieurs des interfaces de filtre suivantes: System.Web.Mvc.IAuthorizationFilter, System.Web.Mvc.IActionFilter, System.Web.Mvc.IResultFilter, System.Web.Mvc.IExceptionFilter, System.Web .Mvc.Filters.IAuthenticationFilter.

Exemple qui écrit la requête dans la fenêtre de débogage:

 public class DebugActionFilter : System.Web.Mvc.ActionFilterAtsortingbute { public override void OnActionExecuting(ActionExecutingContext actionContext) { Debug.WriteLine(actionContext.RequestContext.HttpContext.Request); } } 

Dans FilterConfig -> RegisterGlobalFilters -> ajoutez la ligne suivante: filters.Add(new DebugActionFilter()); .

Vous pouvez maintenant capturer toutes les demandes entrantes et les modifier.