ASP.NET MVC 4 перехватывать все входящие запросы
есть ли способ для меня, чтобы поймать все входящие запросы на мой ASP.NET приложение MVC 4 и запустите некоторый код, прежде чем продолжить запрос к указанному контроллеру/действию?
Мне нужно запустить некоторый пользовательский код аутентификации с существующими службами, и чтобы сделать это правильно, мне нужно будет перехватывать все входящие запросы от всех клиентов, чтобы дважды проверить некоторые вещи с другой службой.
4 ответов:
наиболее правильным способом было бы создать класс, который наследует ActionFilterAttribute и заменить
OnActionExecutingметод. Это может быть зарегистрировано вGlobalFiltersinGlobal.asax.csконечно, это будет только перехватывать запросы, которые на самом деле имеют маршрут.
для этого можно использовать HttpModule. Вот пример, который я использую для расчета времени процесса для всех запросов:
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 */ } } }и вот как вы регистрируете модуль в Интернете.Config:
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="PerformanceMonitorModule" type="Sample.HttpModules.PerformanceMonitorModule" /> </modules> <//system.webServer>
Я думаю, что то, что вы ищите это:
Application_BeginRequest()http://www.dotnetcurry.com/showarticle.aspx?ID=126
вы положили его в
Global.asax.cs.protected void Application_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Request.....; }Я использую это для целей отладки, но я не уверен, насколько хорошее решение это для вашего случая.
Я не уверен в MVC4, но я думаю, что это довольно похоже на MVC5. Если вы создали новый веб-проект - > смотрите в
Global.asaxи вы должны увидеть следующую строкуFilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);в методеApplication_Start().
RegisterGlobalFiltersметод в файлеFilterConfig.csрасположенный в папкеApp_Start.как сказал @YngveB-Nilsen
ActionFilterAttributeэто путь, по моему мнению. Добавьте новый класс, производный отSystem.Web.Mvc.ActionFilterAttribute. Это важно, потому чтоSystem.Web.Http.Filters.ActionFilterAttributeзавершится исключение, например.данный экземпляр фильтра должен реализовать одно или несколько из следующих действий интерфейсы фильтра: система.Сеть.Mvc.IAuthorizationFilter, Система.Сеть.Mvc.IActionFilter, System.Сеть.Mvc.IResultFilter, Система.Сеть.Mvc.IExceptionFilter, Система.Сеть.Mvc.Фильтры.IAuthenticationFilter.
пример, который записывает запрос в окно отладки:
public class DebugActionFilter : System.Web.Mvc.ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext actionContext) { Debug.WriteLine(actionContext.RequestContext.HttpContext.Request); } }на
FilterConfig->RegisterGlobalFilters-> добавить следующую строку:filters.Add(new DebugActionFilter());.теперь вы можете ловить все входящие запросы и изменять их.
Comments