2016-02-22 69 views
0

在global.asax中有以下代碼,當存在404異常時,它將傳輸到靜態NotFound.aspx文件。這適用於我的開發機器,具有調試或發佈版本。將發佈版本部署到一個蔚藍應用服務時,不是獲取我的靜態NotFound.aspx文件,而是獲取僅包含文本的頁面:The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.Server.Transfer從Global.asax在部署到Azure時不工作

我已驗證靜態文件是否存在於天藍色的部署中。

在Global.asax中的代碼是:

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

     HttpException httpException = exception as HttpException; 


     if (httpException != null) 
     { 
      ErrorLogger.Log(httpException); 
      Server.ClearError(); 
      switch (httpException.GetHttpCode()) 
      { 
       case 404: 
        // page not found 
        Response.StatusCode = 404; 
        Server.Transfer("~/NotFound.aspx");       
        break; 
       default: 
        Response.StatusCode = 500; 
        Server.Transfer("~/Error.aspx");       
        break;      
      } 

     } 
    } 
+0

你不應該從被重定向'Global.asax'文件,你應該在我看來,一個單獨的類文件,你的日誌,而不是清除錯誤你也應該做這樣的事情'Exception ex = Server.GetLastError()',然後在那之後調用logging方法,例如在utils類中,並將'ex'作爲參數傳遞給logging方法 – MethodMan

回答

1

這個問題似乎是在Azure服務器環境有它的httpErrors在他們到達的Application_Error之前截獲這些錯誤的方式定義的配置部分。你可以修改這個來讓錯誤通過,或者用它來處理第一個錯誤(這似乎是最好的選擇)。使用responseMode="File"可以避免發出重定向,並直接提供自定義錯誤頁面和正確的狀態代碼。這似乎是一種更高效和正確的方法。 例子:

<system.webServer> 
<httpErrors errorMode="Custom" existingResponse="Replace" > 
    <remove statusCode="404"/> 
    <error statusCode="404" path="NotFound.html" responseMode="File"/> 
    <remove statusCode="500"/> 
    <error statusCode="500" path="Error.html" responseMode="File"/> 
    <remove statusCode="400"/> 
    <error statusCode="400" path="Error.html" responseMode="File"/> 
</httpErrors> 
</system.webServer> 

欲瞭解更多信息:

https://www.iis.net/configreference/system.webserver/httperrors

0

您也可以嘗試在指定的Web.config重定向規則:

<configuration> 
    <system.webServer> 
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"> 
     <remove statusCode="404"/> 
     <add statusCode="404" path="/NotFound.aspx" responseMode="Redirect" /> 
    </httpErrors> 
    </system.webServer> 
</configuration> 

然後在您Web.Release.config(或其他配置您在Azure中使用):

<configuration> 
    <system.webServer> 
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace" xdt:Transform="SetAttributes"> 
    </httpErrors> 
    </system.webServer> 
</configuration> 

你可以添加你的代碼500 err或頁面以相似的方式。

將responseMode設置爲重定向會使IIS用302重定向用戶,將其設置爲ExecuteURL將用錯誤頁面替換響應,但將URL保留在地址欄中。

下面是有關處理錯誤,在這樣漂亮的文章:http://tedgustaf.com/blog/2011/5/custom-404-and-error-pages-for-asp-net-and-static-files/

+0

用戶瀏覽器將如何顯示?他們會得到重定向301/302,然後用404加載錯誤頁面?理想情況下,他們應該獲得404的地方,沒有重定向。另外你如何處理用這種方法記錄不良請求? – jackmott

+0

看到我的編輯,你需要使用ExecuteURL作爲responseMode。對於日誌記錄,您應該使用ELMAH等框架。另一種方法是自己註冊一個日誌記錄HTTP模塊,但我發現ELMAH非常易於使用。 – juunas

相關問題