【问题标题】:ASP.NET rewritten custom errors do not send content-type headerASP.NET 重写自定义错误不发送内容类型标头
【发布时间】:2011-09-14 14:27:34
【问题描述】:

我的 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 请求验证阻止,返回错误页面,但没有 content-type 标头。 IE 推断内容并呈现 HTML,但是 Firefix(正确的 IMO)将内容视为文本并显示 HTML 代码。

是否需要采取其他步骤来说服 ASP.NET 发送内容类型标头?我认为这与它从文件系统中提取文件的事实有关,但 MIME 类型似乎在服务器上配置正确。

【问题讨论】:

  • 你有没有找到解决这个问题的方法。我有同样的问题。应该在提供错误页面之前设置内容类型。
  • 不,不要害怕。整个 IIS 错误真的让我很烦,一团糟。
  • 呃,我遇到了同样的问题,遇到了你的问题。我不敢相信没有更多的骚动。

标签: asp.net


【解决方案1】:

我的 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";
        // .
        // .
        // .
    }
    // .
    // .
    // .
}

有点烦人,但我想到的最简单的解决方案。

【讨论】:

  • 我开始在 Global.asax 中设置 ContentType 并且它有效,但后来我发现问题在于缺少 HTTP 代码 400 的自定义错误页面。一旦我创建它并将其添加到 web .config 它开箱即用,不需要对 Global.asax 进行任何更改。
【解决方案2】:

使用静态文件错误页面,我没有找到任何解决方案。

使用动态错误页面,正确设置标题。但是您可能会在此过程中丢失错误状态代码,然后应在错误页面代码中自行设置。 (这在某种程度上是 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 重新解决了这个问题。)

【讨论】:

    【解决方案3】:

    ASP.Net 不会发送此 IIS 将。如果您希望 ASP.Net 发送它,请尝试添加一个 Error.aspx 并查看它的外观?

    我的意思是,您将被发送到一个 html 页面 - 除非您已连接 IIS 以通过 aspnet 运行这些页面,否则它将正常提供服务。

    如果您添加新页面 error.aspx,您可以 a) 检查 ASP.Net 是否已解决您的问题或 b) 在其中手动添加标题。

    【讨论】:

    • 我可能错了,但我相信 customErrors 部分是针对 ASP.NET 错误的。参考:msdn.microsoft.com/en-us/library/h0hfz6fc.aspx。我的问题是,当这些 IIS 错误发生时,我想提供一个 HTML 文件。我能够做到这一点,但由于缺少内容类型标头,它在 FF 中中断。我如何说服 IIS 发送该标头。
    • 是的......我的建议是尝试看看 ASP.Net 是否会为你做这件事。因为我不知道 IIS 如何或为什么不发送标头。
    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2014-07-07
    • 2015-08-29
    相关资源
    最近更新 更多