[asp.net-mvc] ASP.NET MVC 4는 들어오는 모든 요청을 차단합니다.

ASP.NET MVC 4 앱에 들어오는 모든 요청 을 포착 하고 지정된 컨트롤러 / 작업에 대한 요청을 계속하기 전에 일부 코드를 실행할 수있는 방법이 있습니까?

기존 서비스에서 일부 사용자 지정 인증 코드를 실행해야하며이를 제대로 수행하려면 모든 클라이언트에서 들어오는 모든 요청을 가로 채서 다른 서비스에서 몇 가지 사항을 다시 확인할 수 있어야합니다.



답변

가장 올바른 방법은 ActionFilterAttribute 를 상속 하고 OnActionExecuting메서드를 재정의 하는 클래스를 만드는 것 입니다. 그런 다음에 등록 할 수 있습니다 GlobalFilters.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 */ }
    }

}

Web.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()

RegisterGlobalFiltersFilterConfig.cs폴더 에있는 파일의 메서드입니다 App_Start.

@ YngveB-Nilsen이 말했듯 ActionFilterAttribute이 내 의견으로는 갈 길이다. .NET에서 파생되는 새 클래스를 추가합니다 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());.

이제 모든 수신 요청을 포착하고 수정할 수 있습니다.


답변