繁体   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