2011-08-07 62 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. 
    } 
} 

這怎麼辦?

+0

什麼Fx版本?這是僅用於正常操作還是錯誤? –

+1

你真的讀過_all_路由問題嗎? –

+0

@Henk Holterman - > .NET 4.0(我會更新這篇文章)。錯誤是唯一的。看看它是如何觸發'context.Error'?當然,我沒有閱讀*所有* ..關於MVC和404處理的一些流行的。 –

回答

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哈爾西 - 可能......但都會很好地工作。 –

+0

@Darin Dimitrov - awesome dude :)但是,注意你是如何硬編碼你的控制器和動作的?是否有可能通過已經確定的uri來做到這一點?例如。 url =; foo/bah/pewpew/notfound'? –

0

您可以使用的HttpContext:

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

不是 - >請重新閱讀問題。這將做一個302臨時重定向,並將url設置爲'/ Error/NotFound' ..這不是我所追求的。這是您使用'CustomErrors'時的默認場景。 –

+0

哦 - 還有一件事。錯誤頁面然後會響應200狀態確定,這是錯誤的(除非你做了一些特殊的代碼來強制頁面的'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); 
    } 

,理想請求處理完成者在這一點上。如果情況並非如此,並且如果請求是沿着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

相關問題