2

我有一個MVC3的網站,我試圖讓404個錯誤頁面正確顯示。我知道了所有的設置,它ASP.NET站點自定義404錯誤阻止服務器錯誤

  • 不重定向的URL,
  • 返回頭實際的404錯誤狀態,
  • 登錄的網址,
  • 是一個自定義的頁面我已經創建,
  • 和是一個實際的動作/控制頁,而不是一個的.aspx/html的頁面。

調試在Visual Studio中,它完美的作品。當我將它發佈到我的測試或生產環境中時,它不起作用,並返回一個通用文件,該文件在標題中找不到404狀態。

錯誤頁面不是默認的404錯誤(thisthis),但似乎是服務器本身的全局自定義(服務器託管多個站點,所有404都顯示相同的簡單線路頁面)。服務器上的錯誤頁面實際上顯示一個500錯誤頁面。另外,我已經設置了Response.TrySkipIisCustomErrors = true來嘗試繞過它,但這不起作用。

在生產和測試服務器,它被正確記錄,如果我有它不會返回404狀態碼,它顯示我的錯誤頁面。因此,我很確定這個動作/視圖正在工作,但它對於服務器來說是某種程度上的。它的運行ASP.NET 4和IIS 7

什麼/任何建議在哪裏調查,以解決這一問題?

。代碼

資源,我根據我的解決方案迄今對
How can I properly handle 404 in ASP.NET MVC?

這是我被捕獲的Application_Error異常做什麼的基礎;我還是有點擔心的,因爲它很容易導致一個循環,所以我試着/逮住一切,以防止該

代碼在Global.asax中(內趕上其他錯誤發生錯誤)

protected void Application_Error(object sender, EventArgs e) 
    { 
      try 
     { 
      Exception exception = Server.GetLastError(); 

      Response.Clear(); 

      HttpException httpException = exception as HttpException; 

      RouteData routeData = new RouteData(); 
      routeData.Values.Add("controller", "Error"); 

      if (httpException == null) 
      { 
       routeData.Values.Add("action", "NotFound"); 
      } 
      else 
      { 
       switch (httpException.GetHttpCode()) 
       { 
        case 404: 
         // Page not found. 
         routeData.Values.Add("action", "NotFound"); 
         break; 
        case 500: 
         // Server error. 
         routeData.Values.Add("action", "ServerError"); 
         break; 


        default: 
         routeData.Values.Add("action", "General"); 
         break; 
       } 
      } 

      routeData.Values.Add("error", exception); 

      Server.ClearError(); 

      Response.TrySkipIisCustomErrors = true; 

      IController errorController = new ErrorController(); 
      errorController.Execute(new RequestContext(
       new HttpContextWrapper(Context), routeData)); 
     } 
     catch 
     { 
      // 
     } 
    } 

代碼中的錯誤控制器

public ActionResult NotFound() 
    { 
     try 
     { 

      Response.StatusCode = (int)HttpStatusCode.NotFound; 
      Response.TrySkipIisCustomErrors = true; 
     } 
     catch 
     {} 
     return View(); 
    } 

回答

0

我有同樣的問題。 web.config文件應該被修改。

<system.webServer>  
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="404" /> 
     <error statusCode="404" responseMode="ExecuteURL" path="/Errors/404" /> 
    </httpErrors> 
    </system.webServer> 

更換/錯誤/ 404與您的自定義錯誤頁的路徑。

+0

我已經有了這個設置,但它不工作。在本地調試時,如果我擺脫了我的全局application_error函數,它不會執行任何操作並顯示默認的[YSOD 404錯誤](http://static.colinmackay.co.uk/images/mvc/2011-05- 13-Step-4-Resource-not-found-ysod.png),並且在服務器上它顯示服務器上404一直出現的錯誤。我相信這是實際服務器的自定義404錯誤。 – Helba 2012-07-13 14:23:41

+0

正如旁註:確保你的404路徑是正確的。我遇到了一個問題,我把我的路徑搞砸了,它默認回到其他404(我的404正在拋出404的哈哈),所以我認爲這個解決方案不起作用。請仔細檢查一下。 – Saedeas 2012-07-13 14:31:13

+0

我已經加倍檢查,因爲知道我,我會輸錯它。但它是正確的路徑(複製/粘貼和在本地工作,但在測試環境中不起作用)我可能會看到是否可以聯繫系統管理員以查看它是否已啓用,但[如本網站所示](http:// tedgustaf.com/en/blog/2011/5/custom-404-and-error-pages-for-asp-net-and-static-files/) – Helba 2012-07-13 14:38:45

0

你有沒有指定的TrySkipIisCustomErrorstrue?檢查here

+0

我已經在Application_error函數中設置爲true,並且它沒有'不要做任何事情。當它加載頁面時,我也將其設置在控制器中,以防設置沒有結束,但這也不起作用。我已經更新了我的問題以反映這一點,並且我意識到顯示的通用404錯誤不是asp.net的默認值。它看起來是服務器的自定義服務器,顯示了服務器上託管的所有網站。 – Helba 2012-07-13 14:18:54

+0

你能發佈你的完整代碼嗎? – VJAI 2012-07-13 14:52:43

+0

對不起,花了一段時間,但我只是發佈我的代碼。此外,我意識到(並且即使我不確定是否應該打開一個新問題也改變了)服務器拋出的錯誤(404應該是什麼)實際上有一個500狀態碼。 – Helba 2012-07-17 22:00:42