【问题标题】:Enable custom errors in Azure在 Azure 中启用自定义错误
【发布时间】:2012-04-07 22:52:03
【问题描述】:

我无法将 IIS 设置为针对 MVC 管道之外的错误提供我的自定义错误页面。如果我在控制器内抛出异常,它就是所有文件,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>

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

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

【问题讨论】:

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


    【解决方案1】:

    IIS 不遵守 defaultResponseMode。您必须为每个错误添加 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>
    

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

    【讨论】:

    • 这绝对很奇怪。不过帮助了我。
    • CustomErrors 也一样,即 不会匹配任何内容。需要像上面那样显式定义每个错误:
    【解决方案2】:

    我确实遇到了这个问题,我在 Azure 上,以下为我解决了这个问题:

        Response.TrySkipIisCustomErrors = true;
    

    【讨论】:

    • 谢谢!救了我一命! :D
    【解决方案3】:

    我在网络上找到了许多解决方案,但都不适用于静态文件(例如不存在的“picture.jpg”)。

    此解决方案适用于 Azure 网站和 Azure WebRole 实例。我使用web.config 转换,因此请根据您自己的需要进行相应更新。

    我使用 ASPX 页面来处理错误,因此我可以设置正确的 HTTP 响应代码(当我使用 .htm 页面时,IIS 总是设置 HTTP 200)

    文件~/404.aspx是:

    <%@ Page Language="C#" AutoEventWireup="false" ContentType="text/html" Debug="false" EnableEventValidation="false" EnableSessionState="False" EnableViewState="false" ResponseEncoding="utf-8" Transaction="Disabled" ValidateRequest="false" ViewStateMode="Disabled" %>
    <% Context.Response.StatusCode = 404; %>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>404 Error - Page not found</title>
    </head>
    <body>
      <h1>Custom 404 page</h1>
    </body>
    </html>
    

    文件~/500.aspx是:

    <%@ Page Language="C#" AutoEventWireup="false" ContentType="text/html" Debug="false" EnableEventValidation="false" EnableSessionState="False" EnableViewState="false" ResponseEncoding="utf-8" Transaction="Disabled" ValidateRequest="false" ViewStateMode="Disabled" %>
    <% Context.Response.StatusCode = 500; %>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>500 Server Error</title>
    </head>
    <body>
      <h1>Custom 500 page</h1>
    </body>
    </html>
    

    ~/Web.config 的必要部分包含:

    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <customErrors mode="Off" />
      </system.web>
    
      <system.webServer>
        <httpErrors errorMode="Detailed" />
      </system.webServer>
    </configuration>
    

    ~/Web.Release.config 的必要部分包含:

    <?xml version="1.0"?>
    <configuration>
      <customErrors mode="On" defaultRedirect="/500.aspx" redirectMode="ResponseRewrite" xdt:Transform="Replace">
        <!-- AWARE do NOT use address in form "~/404.htm" but in "/404.htm" -->
        <error statusCode="404" redirect="/404.aspx" />
        <error statusCode="500" redirect="/500.aspx"/>
      </customErrors>
    
      <system.webServer>
        <httpErrors errorMode="Custom" existingResponse="Replace" xdt:Transform="Replace">
          <!-- AWARE do NOT use address in form "~/404.htm" but in "/404.htm" -->
          <remove statusCode="404" />
          <error statusCode="404" path="/404.aspx" responseMode="ExecuteURL" />
    
          <remove statusCode="500" />
          <error statusCode="500" path="/500.aspx" responseMode="ExecuteURL" />
        </httpErrors>
      </system.webServer>
    </configuration>
    

    结束。

    【讨论】:

      【解决方案4】:

      确保您已设置此设置。

      <system.webServer>
      
          <modules runAllManagedModulesForAllRequests="true"/>
      
      </system.webServer>
      

      否则,您的 IIS 应用程序也可能在经典模式而不是集成模式下运行,这是 IIS 设置,但我认为集成模式是 Azure 中的默认设置(但老实说我没有检查过)

      【讨论】:

      • 该设置存在。应用程序正在集成模式下运行。
      猜你喜欢
      • 2017-01-11
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2018-04-07
      • 2014-06-27
      • 2016-08-03
      相关资源
      最近更新 更多