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);
  }
}

В FilterConfigRegisterGlobalFilters → добавьте следующую строку: filters.Add(new DebugActionFilter()); ,

Теперь вы можете отслеживать все входящие запросы и изменять их.