2011-01-07 2 views
3

.net에 조금 익숙하며 몇 가지 개념을 파악하려고합니다..net MVC 3 요청 이벤트

나는 ColdFusion에서 잠시 글을 쓰고 있으며 CF에서는 onRequest()라는 Application.cfc 아래에 이벤트가 있습니다.이 이벤트는 페이지가있을 때마다 발생합니다.

.net에서 요청 정보를 캡처하는 데 사용되는 항목은 무엇입니까?

또한 내 이벤트를 시작하기 위해 요청 이벤트를 래치하거나 연장하는 방법이 있습니까?

답변

4

과 같은 것이 있는데, 이라고 부르기 전에 액션이 적용됩니다. 당신이 모든 컨트롤러에이 액세스하려는 경우 그때는 아마 기본 컨트롤러를 만들어야합니다,

protected virtual void OnActionExecuting(ActionExecutingContext filterContext) { 
    //Do the default OnActionExecuting first. 
    base.OnActionExecuting(filterContext); 

    //The request variable will allow you to see information on the current request. 
    var request = filterContext.RequestContext.HttpRequest; 
} 

그곳이 추가

는 다음을 수행 할 수있는 현재의 요구에 액세스 할 수 있습니다. 또한 Global.asax에 파일을 찾습니다 (예 BeginRequest에 대한) HttpApplication 클래스의 이벤트 중 하나를 사용할 수 있습니다

public class HomeController : BaseController 
{ 
} 
+1

아니요, 모든 컨트롤러에 사용하려면 전역 작업 필터를 사용해야합니다. 작문> 상속. – Ryan

+0

@ Ryan - Four Gang 이외의 다른 것을 읽나요?! 나는 글로벌 액션 필터가 많은 상황에서 과잉이라고 주장 할 것이다. –

+0

나는 개인적인 경험으로 말하고있다. 나의 조언은 당신에게 맞는 것이 무엇인지 알아 내기 위해 여러 가지 방법으로 시도하는 것이다. – Ryan

6

:

http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx

public class BaseController : Controller 
{ 
    //Code above 
} 

그리고 홈 컨트롤러

HttpApplicationRequest 속성을가집니다.

Controller (이미지, CSS, 잘못된 주소)와 관련된 모든 요청을 캐치 할 수 있습니다. 당신은 Global.asax 파일의 코드를 작성하지 않으려면

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_BeginRequest(object sender, EventArgs e) 
    {   
     //Request.Have_fun 
    }  
} 

, 당신은 HttpModule을 사용하는 것이 좋습니다.

이 예제 코드와 함께 새로운 클래스를 만듭니다

using System; 
using System.Web; 

namespace MyProject 
{ 
    public class MyHttpModule : IHttpModule 
    { 
     public void Init(HttpApplication application) 
     { 
      application.BeginRequest += ApplicationBeginRequest; 
      application.EndRequest += ApplicationEndRequest; 
     } 

     private void ApplicationEndRequest(object sender, EventArgs e) 
     { 
      //do something here with HttpContext.Current.Request 
     } 

     private static void ApplicationBeginRequest(Object source, EventArgs e) 
     { 
      //do something here with HttpContext.Current.Request 
     } 


     public void Dispose() 
     { 
     } 
    } 
} 

은 Web.config의에서 (레지스터 HttpModule을) 두 개의 항목을 추가

<system.web> 
    <httpModules> 
    <add name="MyHttpModule" type="MyProject.MyHttpModule" /> 
    </httpModules> 
</system.web> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="MyHttpModule" type="MyProject.MyHttpModule" /> 
    </modules> 
</system.webserver> 

때문에 IIS7의 변화를 (추가의 system.webServer 섹션) , web.config에 두 개의 항목을 추가해야합니다.

+0

LukLed 나에게 HttpModule에 대해 좀 더 자세히 설명해 주시겠습니까? – jcreamer898

+0

@ jcreamer898 : HttpModule을 만들기위한 코드를 추가했습니다. 또한 Google에서 많은 자습서를 찾을 수 있습니다. – LukLed

+0

이것은 MVC를위한 매우 무거운 수동 방식입니다. ASP.NET MVC에서는 'OnActionExecuting'또는 액션 필터가 다른 답변과 마찬가지로 더 나은 접근 방식이라고 제안합니다. –

1

ASP.NET MVC 3에서 작업하는 경우 ASP.NET 응용 프로그램/요청 스택에 직접 두드리는 대신 전역 작업 필터 (처리하려는 "이벤트"당 하나 사용)를 사용하는 것이 좋습니다.