ASP.NET MVC 4 перехватывает все входящие запросы
Есть ли способ поймать входящие запросы all для моего приложения ASP.NET MVC 4 и запустить код перед продолжением запроса к указанному контроллеру/действию?
Мне нужно запустить некоторый пользовательский код аутентификации с существующими службами, и для того, чтобы сделать это правильно, мне нужно будет перехватить все входящие запросы от всех клиентов, чтобы дважды проверить некоторые вещи с помощью другой службы.
Ответы
Ответ 1
Наиболее правильным способом было бы создать класс, который наследует ActionFilterAttribute и переопределяет метод OnActionExecuting
. Затем это можно зарегистрировать в GlobalFilters
в Global.asax.cs
Конечно, это будет только перехватывать запросы, которые действительно имеют маршрут.
Ответ 2
Вы можете использовать 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 */ }
}
}
И вот как вы регистрируете модуль в Web.Config:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="PerformanceMonitorModule" type="Sample.HttpModules.PerformanceMonitorModule" />
</modules>
<//system.webServer>
Ответ 3
Я думаю, что вы ищете это:
Application_BeginRequest()
http://www.dotnetcurry.com/showarticle.aspx?ID=126
Вы помещаете его в Global.asax.cs
.
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Request.....;
}
Я использую это для целей отладки, но я не уверен, насколько это хорошо для вашего дела.
Ответ 4
Я не уверен в 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
завершится сбоем со следующим исключением, например.
Данный экземпляр фильтра должен реализовать один или несколько из следующих интерфейсов фильтра: System.Web.Mvc.IAuthorizationFilter, System.Web.Mvc.IActionFilter, System.Web.Mvc.IResultFilter, System.Web.Mvc.IExceptionFilter, System.Web.Mvc.Filters.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());
,
Теперь вы можете отслеживать все входящие запросы и изменять их.