2011-06-05 56 views
2

有許多關於SO和Web的文章試圖正常處理404和異常。一勞永逸什麼是處理MVC中的錯誤,異常和404的最佳路由方法

從我讀過的最好的建議似乎是對404的像這樣的路線:

routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "ErrorController", action = "PageNotFound" } 
    ); 

那麼對於其他錯誤對控制器的HandleError屬性附加傷害,並已在的customErrors web.config中開啓所以它進入error.cshtml頁面。

但是我讀過,如果你得到一個不會將HTTP代碼設置爲500的異常,則HandleError將不起作用。

我們能否最終生成一個答案/最佳實踐來處理404's/Exceptions/ASP.Net錯誤,我們可以將其應用於所有項目?

謝謝

+0

【如何有一個自定義404個500與A股標準ASP錯誤頁的可能重複。 NET MVC3網站?](http://stackoverflow.com/questions/6173168/how-to-have-a-custom-404-and-500-error-pages-with-a-stock-standard-asp-net- mvc3-w) – 2011-06-05 23:32:22

回答

0

無需設置404路線。 在全局asax應用程序啓動時,設置一個全局過濾器來捕獲控制器存在但不包含動作的404,或者動作返回404結果。

 filters.Add(new HttpNotFoundFilterAttribute { Order = 99 }); 

其中濾波器是與此覆蓋一個ActionFilterAttribute:

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Result !=null && 
      (filterContext.Result.GetType() == typeof(HttpNotFoundResult)) 
     { 
      //You can transfer to a known route for example 
      filterContext.Result = new TransferResult(SomeAction, SomeController); 
     } 
    } 

而且也在的Application_Error,萬一沒有控制器存在:

 Exception ex = Server.GetLastError(); 
     string uri = null; 
     if (Context != null && Context.Request != null) 
     { 
      uri = Context.Request.Url.AbsoluteUri; 
     } 

     Exception baseEx = ex.GetBaseException(); 
     var httpEx = ex as HttpException; 

     if ((httpEx != null && httpEx.GetHttpCode()==404) 
       || (uri != null && Context.Response.StatusCode == 404)) 
      { /* do what you want. */ 
       //Example: show some known url 
       Server.ClearError(); 
       Server.TransferRequest(transferUrl); 
      } 

爲了避免處理404爲靜態資源,您應該在Windows 7或Windows 2008 R2上安裝SP1以升級IIS7並在web.config中設置:

... 
<modules runAllManagedModulesForAllRequests="false"> 
... 
+0

這是否需要(在web.config文件中)customerrors = on? – 2011-06-05 23:34:34

+0

那麼沒有。此過濾器不是錯誤處理過濾器,並且會在任何錯誤過濾器之前調用 - 由於代碼將404結果變爲其他內容,因此不會調用該過濾器。 – Softlion 2011-06-06 14:17:58

+0

runAllMan ... ts = false做什麼?如在哪個模塊(或多個模塊)真的被關閉?其次,用'新的TransferResult(SomeAction,SomeController);'是Action和Controller對你的錯誤控制器的操作方法呢? – 2011-06-07 01:33:52

1

我使用一個簡單的錯誤處理設置。很好很簡單。更多信息可以在http://erictopia.com/2010/04/building-a-mvc2-template-part-7-custom-web-errors-and-adding-support-for-elmah/

安裝ELMAH並讓它處理所有的錯誤。

接下來創建一個錯誤控制器。添加一個包羅萬象的路線是這樣的:

routes.MapRoute(
    "ErrorHandler", // Route name 
    "{*path}",  // URL 
    new { controller = "Error", action = "Index" } 
); 

然後在web.config中添加此部分:

<customErrors mode="RemoteOnly" defaultRedirect="/Error/Index"> 
     <error statusCode="403" redirect="/Error/NoAccess" /> 
     <error statusCode="404" redirect="/Error/NotFound" /> 
</customErrors> 
+0

這是否會在查詢字符串中追加一些廢話?像errorurl =/blah/foo或其他什麼? – 2011-06-06 13:20:36

+0

與此相關的問題是,您將默認捕獲所有404包括靜態資源(圖像,CSS,...)。 – Softlion 2011-06-06 14:19:32

+0

@Softion - 那有什麼問題?如果瀏覽器要求一個不在那裏的圖像,他們應該得到一個404,對吧?這與您的解決方案相比如何?你仍然需要處理404的靜態資源。 – 2011-06-07 01:32:33

相關問題