2011-06-10 69 views
12

我有一個asp.net mvc應用程序,並試圖使用IISExpress獲得自定義錯誤。自定義錯誤不能與IISExpress一起工作

工程在卡西尼罰款:

<customErrors mode="On" defaultRedirect="/error"> 
    <error statusCode="404" redirect="/error/notfound"/> 
</customErrors> 

當我已經部署MVC網站到IIS(7.5)之前,所有我不得不這樣做讓我的工作定義錯誤是設置:

<httpErrors errorMode="Detailed"/> 

我已經嘗試明確指定httpErrors部分中的狀態碼,但沒有任何工作。這裏是一個例子:

<httpErrors errorMode="Detailed" defaultResponseMode="Redirect"> 
    <clear/> 
    <error statusCode="404" path="/error/notfound"/> 
</httpErrors> 

任何想法?

感謝 本

回答

12

這是由於我如何自定義錯誤實際上是在調用誤解,也是事實,(恕我直言),在asp.net mvc的錯誤的處理有點搞砸了部分造成的。

第一個問題是,在我的一些操作方法中,我檢查是否存在一個對象,博客帖子,並且如果博文是空的,則返回HttpNotFoundResult。我假設這會顯示我爲404錯誤設置的自定義錯誤頁面。

但是,情況並非如此。返回一個HttpNotFoundResult只需將響應的狀態代碼設置爲404.其餘部分則由IIS處理,顯示IIS 404錯誤頁面,或者由瀏覽器(如果它有自己的自定義錯誤頁面)處理。

這裏的一個解決方案是返回一個HttpException,其中使用您的自定義錯誤頁面,因爲請求由asp.net處理。

我選擇的是創建一個新的ActionResult,它允許我指定一個視圖以及一個http狀態碼。我傾向於拋出異常。

下一個問題是,默認情況下,一個新的MVC項目定義了一個貪婪路由。如果您向/foo/bar發出請求,默認MvcHandler將查找名爲Foo的控制器。當它找不到時,它將返回404.

我已經刪除了默認路由並且沒有貪婪路由。這意味着不匹配我的任何路線的網址不會被asp.net處理,而只會回退到IIS。

的這裏的解決方案是建立在我的路由配置底部的通配符路由匹配所有其他請求,然後轉發到自定義PageNotFound動作,即設置狀態代碼404,顯示我的自定義視圖。

有些事情值得指出。

  1. 您需要設置httpErrors errorMode="Detailed"以使自定義錯誤頁面顯示在IIS/IISExpress中。其餘的可以單獨留下。
  2. customErrors部分設置defaultRedirect路徑對500個錯誤沒有影響。這是因爲全球HandleErrorAttribute可處理所有500個錯誤,只是尋找名爲「錯誤」的視圖來顯示。這意味着如果您的自定義錯誤頁面實際上是一個控制器操作,它將不會被調用。即使明確指定了500錯誤頁面,以上情況也是如此。
  3. 但是,您仍然應該保留defaultRedirect路徑,因爲如果未明確指定它,它將用於其他狀態代碼。
+3

httpErrors errorMode =「詳細」缺少部分對我來說,謝謝 – st78 2011-06-29 13:43:45

1

如果您正在使用iisexpress你可以註釋掉整個httpErrors部分< - - >在對ApplicationHost.config並用以下替換:

<httpErrors errorMode="Custom"> 
    <error responseMode="Redirect" statusCode="404" path="../missing/index.php" /> 
</httpErrors> 

路徑是url路徑到您的自定義網站特定頁面

相關問題