2013-01-07 45 views
4

使用接受的答案this question我實現了自定義錯誤處理邏輯。它運行在運行Visual Studio 2012的本地PC上,允許我爲403,404和一般錯誤創建自定義視圖。問題是,當我將它部署到Azure時,IIS開始顯示錯誤消息,而不是我的MVC應用程序。我需要做一個配置更改以允許MVC控制錯誤消息處理嗎?IIS不允許MVC應用程序控制Azure上的錯誤消息

回答

5

儘管我不確定爲什麼我的PC(帶有IIS Express的Windows 8)的默認設置不同,但是當部署到Windows 2012 Server(IIS 8)時,您需要在Web.config系統中添加以下內容。 webServer部分:

<httpErrors errorMode="Detailed" /> 
+0

我可以吻你! 但是,我會把我的虛擬帽子丟給你,先生,而不是:) –

0

問題是部署版本中的默認錯誤處理程序正在覆蓋您的Application_Error邏輯。檢查部署並設置爲customErrors mode =「On」的web.config變換並設置適當的重定向。然後你需要禁用全局過濾器HandleError。註釋掉RegisterGlobalFilters中的HandleErrorAttribute行。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    //filters.Add(new HandleErrorAttribute()); 
} 
+0

我已經註釋掉該部分以使自定義錯誤處理工作。我也嘗試設置customErrors mode =「On」,並嘗試「關閉」,並且都產生了相同的結果。從Azure上的IIS返回的消息是:您正在查找的資源已被刪除,名稱已更改或暫時不可用。 – Josh

+0

我認爲你有衝突的錯誤處理產生不同的結果。如果您在鏈接中描述的Application_Error中執行錯誤處理,則刪除customErrors元素。接下來確保您的控制器/操作與Application_Error中引用的那些匹配。最後,添加Server.ClearError();在Response.Clear()之前的Application_Error中; – viperguynaz

1

我會推薦一個不同的解決方案,然後你引用的那個。我對此有點生疏,但我記得設置起來相當簡單。沒有太多的代碼或配置。下面是我的配置是這樣的:

<!--This is the catch all error page. All these views are located in project directory Views/Shared --> 
<customErrors mode="On" defaultRedirect="~/error/Error"> 
    <!--Custom 404--> 
    <error statusCode="404" redirect="~/error/Notfound"></error> 
    <!--Custom 401--> 
    <error statusCode="401" redirect="~/error/NotAuthorized"></error> 
</customErrors> 

如果你想添加錯誤的自定義/通用日誌嘗試創建自己的HandleErrorAttribute。使用繼承並重寫OnException方法。類似這樣的:

public class CustomErrorHandler : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     //your logging code here 

     base.OnException(filterContext); 
    } 
} 

您還可以捕獲異常並讓它們爲您顯示自定義錯誤頁面。在我的應用我用它來定製自己的401這裏是我的Global.cs RegisterGlobalFilters樣子:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new CustomErrorHandler 
         { 
          ExceptionType = typeof(NotAuthorizedHttpException), 
          View = "NotAuthorized", 
          Order = 2 
         }); 

     //Leave this line uncommented to let your customer error handler 
     filters.Add(new CustomErrorHandler()); 
    } 

我沒有註冊任何特殊的路由這個工作。最後一個警告。確保您的錯誤頁面包含在您的項目中,否則在您發佈到Azure時不會部署它們。

希望有幫助!

+0

我的目標是在將用戶發送到錯誤頁面之前創建日誌錯誤,這就是爲什麼我喜歡在Global.asax中使用Application_Error()事件的原因。必須有一個配置設置,我可以使用該設置允許MVC應用程序控制錯誤頁面,與Azure相反,IIS控制它。 – Josh

+0

已更新回答,以在自定義日誌記錄中包含推薦。 –

+0

有趣,但我相信這仍然只能處理MVC範圍內的錯誤。 Application_Error將處理任何ASP.NET錯誤。我終於弄清楚了使其工作所需的配置價值。我會很快發佈。 – Josh

相關問題