5

Вопрос по asp.net-mvc-3, asp.net-mvc – Включить пользовательские ошибки в Azure

Я не могу настроить 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>

IIS default error page

/ error / * обрабатывается контроллером внутри моего приложения. Что я могу сделать, чтобы IIS выполнял пользовательский путь ошибки, вместо того, чтобы кормить меня стандартной страницей ошибок?

Это ASP.NET MVC 3, работающий на Azure. Он также не работает под прямым IIS, но сервер разработки выполняет контроллер.

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от CMircea
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • 4

    У меня была именно эта проблема

    и я был на Azure, следующие проблемы решили ее для меня:

        Response.TrySkipIisCustomErrors = true;
    

  • 9

    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>
    

    Почему по умолчанию не применяется, я не знаю.

  • 3

    Я нашел много решений в Интернете

    но ни одно из них не работало также и для статических файлов (например, для несуществующих «picture.jpg»).

    Это решение работает для меня как на веб-сайтах Azure, так и на экземпляре Azure WebRole. я используюweb.config преобразования, поэтому обновите его для собственных нужд соответственно.

    Я использую страницы ASPX для ошибок, чтобы я мог установить правильный код ответа HTTP (IIS всегда устанавливает HTTP 200, когда я использовал страницы .htm)

    файл~/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>
    

    Конец.

  • 0

    Убедитесь, что вы установили этот параметр.

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

    В противном случае ваше приложение IIS также могло бы работать в классическом режиме вместо интегрированного режима, который является настройкой IIS, однако я думал, что интегрированный режим является стандартным в Azure (но, честно говоря, я не проверял)