簡體   English   中英

ASP.NET重寫的自定義錯誤不會發送內容類型標頭

[英]ASP.NET rewritten custom errors do not send content-type header

我的web.config中有以下配置:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Error.html">
    <error statusCode="404" redirect="~/Error/Error.html" />
    <error statusCode="400" redirect="~/Error/Error.html" />
</customErrors>

FWIW,這是一個ASP.NET MVC 3應用程序。

當我生成錯誤。 例如通過訪問..

http://testserver/this&is&an&illegal&request

..被ASP.NET請求驗證阻止..返回錯誤頁面,但沒有內容類型標頭。 IE推斷內容並呈現HTML,但Firefix(正確IMO)將內容視為文本並顯示HTML代碼。

是否需要采取其他步驟來說服ASP.NET發送內容類型標頭? 我認為這與它從文件系統中挑選文件的事實有關,但是MIME類型似乎在服務器上正確配置。

我的ASP.NET MVC 2應用程序正在發送內容類型標題 - Content-Type:text / html。 然后,在將應用程序池從.Net Framework v2升級到.Net Framework v4后,它開始提出這個奇怪的問題。 我正在使用以下配置

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/500.html">
    <error statusCode="404" redirect="/404.html" />
</customErrors>

我想堅持自定義錯誤頁面的靜態頁面。

我能想到的唯一解決方案是在Global.asax.cs文件中的MvcApplication類的Application_Error方法中顯式設置標頭。

public class MvcApplication : System.Web.HttpApplication
{
    // .
    // .
    // .
    void Application_Error(object sender, EventArgs e)
    {
        // .
        // Remember to set Response.StatusCode and
        // Response.TrySkipIisCustomErrors
        // .
        Response.ContentType = "text/html";
        // .
        // .
        // .
    }
    // .
    // .
    // .
}

有點煩人但是我想到的最簡單的解決方案。

有了靜態文件錯誤頁面,我還沒有找到任何解決方案。

使用動態錯誤頁面,正確設置標頭。 但是您可能會丟失過程中的錯誤狀態代碼,然后應在錯誤頁面代碼中自行設置它。 (這有點像rangitatanz的答案,但可能更明確地寫。)

所以這是我使用的示例解決方案(webform方式):

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/unknown.aspx">
    <error statusCode="404" redirect="~/Error/404.aspx" />
    <error statusCode="400" redirect="~/Error/400.aspx" />
</customErrors>

並在頁面加載(這里為404一個):

protected void Page_Load(object sender, EventArgs e)
{
    Response.StatusCode = 404;
    Response.StatusDescription = "Not found";
    Response.TrySkipIisCustomErrors = true;
}

這可以在MVC項目中使用。 如果您不想混合使用webforms和MVC,可以為其創建一個錯誤控制器及其關聯的視圖。 (這確實是我進入MVC項目的方式,但目前我回到了webform項目,因此我使用webform重新解決了這個問題。)

ASP.Net不會發送這個IIS。 如果你想讓ASP.Net發送它然后嘗試添加一個Error.aspx,看看它是什么樣的?

我在這里的意思是你將被發送到一個HTML頁面 - 除非你已經連接IIS通過aspnet運行這些頁面,否則它將正常提供。

如果您添加新頁面error.aspx,您可以a)檢查ASP.Net是否已修復您的問題或b)手動添加您的標題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM