asp.net-mvc - 在 Azure 中启用自定义错误

标签 asp.net-mvc asp.net-mvc-3 iis azure

我无法将 IIS 设置为针对 MVC 管道之外的错误提供自定义错误页面。如果我在 Controller 内抛出异常,那么它就是所有文件,Application_Error 事件会处理该异常:

    protected void Application_Error(object sender, EventArgs e)
    {
        var error = Server.GetLastError();

        var routeData = new RouteData();
        routeData.Values["Controller"] = "Error";
        routeData.Values["Area"] = "";
        routeData.Values["Exception"] = error;

        if (error is HttpException)
        {
            switch (((HttpException)error).GetHttpCode())
            {
                case 401:
                    routeData.Values["Action"] = "NotAllowed";
                    break;

                case 403:
                    routeData.Values["Action"] = "NotAllowed";
                    break;

                case 404:
                    routeData.Values["Action"] = "NotFound";
                    break;
                default:
                    routeData.Values["Action"] = "ServerError";
                    break;
            }
        }
        else
        {
            routeData.Values["Action"] = "ServerError";
        }

        Response.Clear();
        Server.ClearError();

        IController controller = new ErrorController();
        controller.Execute(new RequestContext(new HttpContextWrapper(((MvcApplication)sender).Context), routeData));
    }

但是,如果我浏览到不存在的 URL,IIS 将处理 404 错误(或任何其他错误),为我提供标准 IIS 错误消息并完全忽略我的 web.config 设置:

 <system.web>
  <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/error">
    <error statusCode="401" redirect="/error/notallowed" />
    <error statusCode="403" redirect="/error/notallowed" />
    <error statusCode="404" redirect="/error/notfound" />
    <error statusCode="500" redirect="/error/servererror" />
  </customErrors>
</system.web>

<system.webServer>
  <httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
    <clear />
    <error statusCode="401" path="/error/notallowed" />
    <error statusCode="403" path="/error/notallowed" />
    <error statusCode="404" path="/error/notfound" />
    <error statusCode="500" path="/error/servererror" />
  </httpErrors>
</system.webServer>

IIS default error page

/error/* 由我的应用程序内的 Controller 处理。我该怎么做才能让 IIS 执行自定义错误路径,而不是向我提供标准错误页面?

这是在 Azure 上运行的 ASP.NET MVC 3。它也不能在直接的 IIS 下工作,但开发服务器确实执行 Controller 。

最佳答案

IIS 不遵循默认响应模式。您必须为每个错误添加responseMode,如下所示:

<httpErrors errorMode="Custom">
  <clear />
  <error statusCode="401" path="/error/notallowed" responseMode="ExecuteURL" />
  <error statusCode="403" path="/error/notallowed" responseMode="ExecuteURL" />
  <error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" />
  <error statusCode="500" path="/error/servererror" responseMode="ExecuteURL" />
</httpErrors>

为什么默认值不适用,我无法理解。

关于asp.net-mvc - 在 Azure 中启用自定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10059009/

相关文章:

asp.net-mvc - ASP.Net MVC : Where to store Application and Admin Panel settings? Web.config?

mysql - 使用 ASP.NET MVC 4 应用程序配置 MySQL

asp.net - 在 asp.net mvc 中实现不跟踪

iis - 部署之间不会保留手动生成的 MachineKey

asp.net - 将 PUT、DELETE 动词添加到 IIS 中的 .aspx 扩展有什么问题吗?

c# - Newtonsoft 忽略属性?

c# - EWS : "The remote server returned error (401) Unauthorized"

asp.net - 当 `HttpGet` 处理 `Create` 操作方法仅返回 `View()` 时,为什么浏览器上没有触发 JavaScript 验证?

javascript - 获取图像可见区域状态以将 Canvas 中的图像设置在先前拖动的位置

asp.net - 绑定(bind)到导航属性导致 "A field or property with the name ' X.X' 未在选定的数据源上找到”仅在 IIS 6 中