ASP.NET MVC 4 перехватывать все входящие запросы



есть ли способ для меня, чтобы поймать все входящие запросы на мой ASP.NET приложение MVC 4 и запустите некоторый код, прежде чем продолжить запрос к указанному контроллеру/действию?



Мне нужно запустить некоторый пользовательский код аутентификации с существующими службами, и чтобы сделать это правильно, мне нужно будет перехватывать все входящие запросы от всех клиентов, чтобы дважды проверить некоторые вещи с другой службой.

502   4  

4 ответов:

наиболее правильным способом было бы создать класс, который наследует ActionFilterAttribute и заменить OnActionExecuting метод. Это может быть зарегистрировано в GlobalFilters in Global.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

    Ничего не найдено.