16

UPD:这是错误处理的完整解决方案

我有普通的 MVC4 网络项目。没有添加,没有删除,只是在 Visual Studio 中创建了一个新项目。

web.config我添加了自定义错误页面处理程序:

<customErrors mode="On" defaultRedirect="~/Content/Error.htm" redirectMode="ResponseRewrite" />

~/Content/Error.htm文件是:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>OOPS! Error Occurred. Sorry about this.</title>
</head>
<body>
    <h2>OOPS! Error Occurred</h2>
</body>
</html>

每当我在网站上收到 404 错误时,Error.htm 在 Firefox 和 Chrome 中以纯文本形式提供:

HTML 显示为纯文本

Fiddler 说错误页面没有content-type标题,这导致浏览器将页面呈现为纯文本:

无内容类型标头

有没有办法强制带有content-type标头的 IIS 服务器错误页面?

ps 实际问题出在一个复杂的 MVC4 项目中,它在 Global.asax 中有自己的错误处理。但我发现有些错误不会通过 ASP 管道,仅由 IIS 处理。就像网址末尾的点一样。< httpErrors />的解决方案确实提供了正确的响应,但是我们在 Global.asax 中的自定义错误处理,Application_Error() 没有以这种方式调用。

UPD看来我无法赢得这场战争。IE 显示正确呈现的 html,Firefox 和 Chrome 显示为纯文本。当我切换到纯文本时,Firefox 和 IE 正确显示空白,IE 吞下空白并尝试呈现 html。如果我尝试将图像作为错误页面提供,Firefox 和 Chrome 会显示图像。IE 显示: IE9 即将破解! Facepalm!

4

4 回答 4

16

对错误页面使用 .aspx 而不是 .htm(将 htm 重命名为 aspx)。

<customErrors mode="On" defaultRedirect="~/Content/Error.aspx" redirectMode="ResponseRewrite" />
于 2013-03-20T21:24:33.043 回答
9

显然,<customErrors>开始工作是一团糟。如果你决定使用它,Ben Foster 有一篇关于这个主题的精彩文章:http: //benfoster.io/blog/aspnet-mvc-custom-error-pages

如果你想使用 .cshtml 页面,最好的办法可能是放弃<customErrors>并处理 Global.asax.cs 中的错误:

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    if (exception != null)
    {
        Response.Clear();
        HttpException httpException = exception as HttpException;
        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        if (httpException == null)
        {
            routeData.Values.Add("action", "Unknown");
        }
        else
        {
            switch (httpException.GetHttpCode())
            {
                case 404:               // Page not found.
                    routeData.Values.Add("action", "NotFound");
                    break;

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


        // Pass exception details to the target error View.
        routeData.Values.Add("Error", exception);
        // Clear the error on server.
        Server.ClearError();
        // Avoid IIS7 getting in the middle
        Response.TrySkipIisCustomErrors = true;
        // Ensure content-type header is present
        Response.Headers.Add("Content-Type", "text/html");
        // Call target Controller and pass the routeData.
        IController errorController = new ErrorController();
        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    }
}

当然,您还需要使用适当的方法和 .cshtml 视图添加一个 ErrorController。

public class ErrorController : Controller
{
    public ActionResult Index()
    {// your implementation
    }

    public ActionResult Unknown(Exception error)
    {// your implementation 
    }

    public ActionResult NotFound(Exception error)
    {// your implementation         
    }
}
于 2014-07-22T23:12:14.090 回答
6

这显然是一个已知的错误,微软的建议与 spiatrax 将 htm/html 重命名为 aspx 的想法一致。就我而言,我还必须包括

<% Response.StatusCode = 400 %>

在 .aspx 页面中。

更多信息:http ://connect.microsoft.com/VisualStudio/feedback/details/507171/

于 2013-11-06T09:00:00.207 回答
0

我在部分下的自定义标题上添加了内容类型标题system.webServer/httpprotocol并修复了它。

<customHeaders><remove name="Content-Type" /><add name="ContentType"value="text/html" /></customHeaders>
于 2019-10-02T14:45:32.163 回答