Запутался с обработкой ошибок в ASP.net 5 MVC 6

Я хотел бы иметь 1 страницу ошибки, которая в зависимости от предоставленной строки запроса отображает для пользователя немного другое сообщение об ошибке.

Я заметил следующий код в файле Startup.cs при создании нового проекта asp.net 5.

if (env.IsDevelopment())
{
    app.UseBrowserLink();
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
}

Я смог заставить это отображать правильную страницу ошибки при возникновении исключения. Моя проблема в том, что он, кажется, только улавливает ошибки, которые не были обработаны в моем приложении, то есть всегда с кодом состояния 500. Это правильно?

Для обработки ошибок 404 я использую следующий код:

app.UseStatusCodePagesWithReExecute("/Error/{0}"); 

С моим контроллером, реализованным как:

[HttpGet("{statusCode}")]
public IActionResult Error(int statusCode)
{
    return View(statusCode);
}

Кажется, это улавливает ошибки 404 и отображает правильный код состояния.

Если я обновлю свой код в приведенном выше операторе if, чтобы использовать то же действие, например:

if (env.IsDevelopment())
{
    app.UseBrowserLink();
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error/{0}");
}

Возвращаемый код состояния всегда равен 0.

Кроме того, что произойдет, когда произойдет 400, 403 или любое другое событие? Будут ли они пойманы? Если да, то в какой момент они будут пойманы?

Как вы можете сказать, я очень запутался и хотел бы, чтобы кто-нибудь предоставил мне пример, где обрабатываются все различные коды состояния.


person Cool Breeze    schedule 27.01.2016    source источник
comment
Не поймаете глобальную ошибку в событии Application_Error внутри справки global.asax? stackoverflow .com/questions/16884074/   -  person Viswas Menon    schedule 27.01.2016
comment
Это похоже на asp.net MVC5?   -  person Cool Breeze    schedule 27.01.2016
comment
Не могли бы вы опубликовать код UseExceptionHandler?   -  person Mairaj Ahmad    schedule 01.02.2016
comment
??? это встроено в asp?   -  person Cool Breeze    schedule 01.02.2016
comment
Готовы ли вы разработать какой-то новый общий механизм для решения этой проблемы или просто хотите, чтобы все вписывалось в уже существующий код?   -  person Zeeshan    schedule 02.02.2016


Ответы (1)


Похоже, вы путаете необработанные исключения (которые по умолчанию возвращаются клиенту как внутренняя ошибка сервера HTTP 500) и правильно обработанные случаи ошибок, вызванные недопустимым действием от имени пользователя/клиента (где 4xx HTTP код возвращается пользователю).

Только первый из них имеет какое-либо отношение к вызову UseExceptionHandler — по умолчанию он перехватывает любые необработанные исключения и перенаправляет их на то, что вы предоставляете (в вашем случае — на представление, но это может быть и фрагмент кода, который проверяет необработанные исключения для преобразования определенных случаев ошибок в коды возврата HTTP 4xx — например, ошибки аутентификации в ответы HTTP 401).

UseStatusCodePagesWithReExecute будет вмешиваться, когда был сгенерирован код состояния 400-599, если тело ответа еще не было сгенерировано. исходный код показывает, как это определен.

Во втором блоке кода вы использовали UseExceptionHandler — я думаю, у вас должно быть следующее:

if (env.IsDevelopment())
{
    app.UseBrowserLink();
    app.UseDeveloperExceptionPage();
}
else
{
    // Handle unhandled errors
    app.UseExceptionHandler("/Home/Error");
    // Display friendly error pages for any non-success case
    // This will handle any situation where a status code is >= 400
    // and < 600, so long as no response body has already been
    // generated.
    app.UseStatusCodePagesWithReExecute("/Error/{0}"); 
}
person Mark Hughes    schedule 01.02.2016
comment
Хорошо, большая часть того, что вы сказали, имеет смысл. Мой единственный вопрос, какие коды ошибок будут в этой строке кода: app.UseStatusCodePagesWithReExecute(/Error/{0}); поймать кроме 404? - person Cool Breeze; 02.02.2016
comment
Вот окончательный ответ на этом - все, что имеет код состояния от 400 до 600 включительно, где тело ответа еще не было сгенерировано, будет обрабатываться UseStatusCodePages. Я обновлю ответ, чтобы отразить это. - person Mark Hughes; 02.02.2016
comment
Точный ответ, спасибо @MarkHughes - person czioutas; 04.11.2016
comment
@MarkHughes исправляет ссылку для окончательного ответа github.com/aspnet/Diagnostics/blob/master/src/ - person Alan Guilfoyle; 12.07.2020