2011-08-07 4 views
1

다음 IHttpModule이 있는데 주어진 절대 또는 상대 URL에 대해 컨트롤러에서 작업을 실행하는 방법을 파악하려고합니다.ASP.NET MVC의 HttpModule에서 컨트롤러 동작을 어떻게 실행합니까?

public class CustomErrorHandlingModule : IHttpModule 
{ 
    #region Implementation of IHttpModule 

    public void Init(HttpApplication context) 
    { 
     context.Error += (sender, e) => 
      OnError(new HttpContextWrapper(((HttpApplication)sender).Context)); 
    } 

    public void Dispose() 
    {} 

    public void OnError(HttpContextBase context) 
    { 
     // Determine error resource to display, based on HttpStatus code, etc. 
     // For brevity, i'll hardcode it for this SO question. 
     const string errorPage = @"/Error/NotFound"; 

     // Now somehow execute the correct controller for that route. 
     // Return the html response. 
    } 
} 

어떻게 수행 할 수 있습니까? 당신은있는 HttpContext를 사용 할 수

+0

어떤 Fx 버전입니까? 정상적인 동작이나 오류에만 해당 되는가? –

+1

_all_ 라우팅 질문을 정말로 읽었습니까? –

+0

@Henk Holterman -> .NET 4.0 (게시물을 업데이트합니다). 오류 만. 'context.Error'에서 어떻게 발사되는지보십시오. 물론 MVC 및 404 처리와 관련하여 * all * .. 몇 가지 인기있는 것들은 읽지 않았습니다. –

답변

7

뭔가 :

public void OnError(HttpContextBase context) 
{ 
    context.ClearError(); 
    context.Response.StatusCode = 404; 

    var rd = new RouteData(); 
    rd.Values["controller"] = "error"; 
    rd.Values["action"] = "notfound"; 
    IController controller = new ErrorController(); 
    var rc = new RequestContext(context, rd); 
    controller.Execute(rc); 
} 

은 또한 다음 related answer 유용 할 수 있습니다.

+0

확실하게 이전보다 오류 컨트롤러 내부에 오류 코드를 설정하고 싶습니까? 어쩌면 내가 뭔가를 놓친 것 같아. –

+0

@ Simon Halsey - 아마도 ...하지만 둘 다 잘될 것입니다. –

+0

@Darin Dimitrov - awesome dude :) 그러나, 당신의 컨트롤러와 액션을 어떻게 하드 코딩했는지 주목 해주십시오. 이미 결정된 uri로 이것을 수행 할 수 있습니까? 예. url =; foo/bah/pewpew/notfound'? –

0

는 :

System.Web.HttpContext.Current.Response.Redirect("/Error/NotFound"); 
+0

아니요 -> 질문을 다시 읽으십시오. 이것은 302 임시 리다이렉션을하고 URL이'/ Error/NotFound'가되도록 설정할 것입니다. 이것은'CustomErrors'를 사용할 때의 기본 시나리오입니다. –

+0

오, 한 가지 더. 그런 다음 오류 페이지는 200 STATUS OK로 응답합니다. 이는 틀린 것입니다 (페이지의'HttpStatus'를 강제 실행하기위한 특별한 코드가없는 한). –

1

난 당신이 HttpContext.Current.RewritePath

이 당신이 사용하고자하는 파일의 경로를 변경할 수 있습니다를 사용할 필요가 있다고 생각. MVC 2 프로젝트에서 만든 default.aspx의 기능입니다.

나는 당신을 302와 같은 오류 처리를하는 것과 거의 같은 방식으로 사용했지만 지금은 내 코드를 얻을 수 없다. 나는 월요일에 몇 가지 코드를 게시 할 것이다. 작업을 수행해야합니다 라인을 따라

0

안녕이 프레임 워크는 라우팅을 사용하여 해당 경로와 모든 구성 요소에 대한 코드를 실행할 수 있도록하려면이 옵션을 사용

// MVC 3 running on IIS 7+ 
    if (HttpRuntime.UsingIntegratedPipeline) 
    { 
     context.Server.TransferRequest(url, true); 
    } 
    else 
    { 
     // Pre MVC 3 
     context.RewritePath(url, false); 

     IHttpHandler httpHandler = new MvcHttpHandler(); 
     httpHandler.ProcessRequest(httpContext); 
    } 

을 그리고 이상적으로 요청을 처리하는이 시점에서 completer입니다. 그렇지 않은 경우 요청을 asp.net http 파이프 라인을 따라 추가로 처리 한 경우이 명령을 사용하여이 시점에서 요청을 중지하고이 요청과 함께 완료되었음을 asp.net에 알려주십시오.

HttpApplication app = (HttpApplication) context.Application; 
app.CompleteRequest();; 

컨텍스트에 응용 프로그램 (현재 VS 근처에 있지 않음)이 있는지 확실하지 않지만 필요한 경우이 모듈에서이 요청을 중지하는 데 사용하십시오.

+0

이 링크로 이동 : http://stackoverflow.com/questions/799511/how-to-simulate-server-transfer-in-asp-net-mvc – Zasz

관련 문제