2016-02-22 2 views
0

У меня есть следующий код в global.asax, который переносится в статический файл NotFound.aspx при наличии исключения 404. Это работает на моей машине разработки с отладочными или релизными сборками. При развертывании сборки релиза в службе azure app вместо получения моего статического файла NotFound.aspx я получаю страницу только с текстом: The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.Server.Transfer from Global.asax не работает при развертывании в Azure

Я проверил, что статические файлы присутствуют в лазурном развертывании.

Код в global.asax является:

protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception exception = Server.GetLastError(); 
     Response.Clear(); 

     HttpException httpException = exception as HttpException; 


     if (httpException != null) 
     { 
      ErrorLogger.Log(httpException); 
      Server.ClearError(); 
      switch (httpException.GetHttpCode()) 
      { 
       case 404: 
        // page not found 
        Response.StatusCode = 404; 
        Server.Transfer("~/NotFound.aspx");       
        break; 
       default: 
        Response.StatusCode = 500; 
        Server.Transfer("~/Error.aspx");       
        break;      
      } 

     } 
    } 
+0

вы не должны перенаправляет от 'Global.asax' файл, который вы должны иметь свой протоколирование в отдельном файле класса, на мой взгляд, вместо устраняя ошибку, вы также должны сделать что-то вроде этого «Exception ex = Server.GetLastError()», после чего вызовите метод ведения журнала, который будет в классе utils, например, и передайте «ex» в качестве параметра для метода ведения журнала – MethodMan

ответ

1

Проблема, кажется, что окружающая среда Azure сервер имеет это httpErrors раздел конфигурации определяется таким образом, что перехватывает эти ошибки, прежде чем они попадут в Application_Error. Вы можете либо изменить это, чтобы пропускать ошибки, либо использовать их для устранения ошибок в первую очередь (что кажется лучшим вариантом). Используя responseMode="File", вы можете избежать необходимости переадресации и просто предоставить собственную страницу ошибок и соответствующий код состояния. Это, по-видимому, более эффективный и правильный подход. Пример:

<system.webServer> 
<httpErrors errorMode="Custom" existingResponse="Replace" > 
    <remove statusCode="404"/> 
    <error statusCode="404" path="NotFound.html" responseMode="File"/> 
    <remove statusCode="500"/> 
    <error statusCode="500" path="Error.html" responseMode="File"/> 
    <remove statusCode="400"/> 
    <error statusCode="400" path="Error.html" responseMode="File"/> 
</httpErrors> 
</system.webServer> 

Для получения дополнительной информации:

https://www.iis.net/configreference/system.webserver/httperrors

0

Вы также можете попробовать указать правило переадресации в Web.config:

<configuration> 
    <system.webServer> 
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"> 
     <remove statusCode="404"/> 
     <add statusCode="404" path="/NotFound.aspx" responseMode="Redirect" /> 
    </httpErrors> 
    </system.webServer> 
</configuration> 

Затем в Web.Release.config (или другой конфигурации, которую вы используете в лазури):

<configuration> 
    <system.webServer> 
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace" xdt:Transform="SetAttributes"> 
    </httpErrors> 
    </system.webServer> 
</configuration> 

Вы можете добавить свой код 500 err или страницу аналогичным образом.

Установка responseMode для перенаправления делает IIS перенаправляет пользователя с помощью 302, устанавливая его в ExecuteURL, заменив ответ на страницу с ошибкой, но сохраните URL-адрес в адресной строке.

Вот хорошая статья об обработке ошибок следующим образом: http://tedgustaf.com/blog/2011/5/custom-404-and-error-pages-for-asp-net-and-static-files/

+0

Как это будет отображаться в браузере пользователей? Получат ли они перенаправление 301/302, а затем загружают страницу с ошибкой в ​​404? В идеале они должны просто получить 404 на месте, без перенаправления. Также как вы обрабатываете регистрацию плохого запроса с помощью этого подхода? – jackmott

+0

См. Мое изменение об этом, вам нужно использовать ExecuteURL как responseMode. Для ведения журнала вы должны использовать структуру, такую ​​как ELMAH. Другой альтернативой может быть регистрация самого HTTP-модуля протоколирования, хотя я считаю ELMAH очень простым в использовании. – juunas

Смежные вопросы