6

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

Я заметил следующий код в файле 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 (env.IsDevelopment()) 
{ 
    app.UseBrowserLink(); 
    app.UseDeveloperExceptionPage(); 
} 
else 
{ 
    app.UseExceptionHandler("/Error/{0}"); 
} 

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

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

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

+0

Wont поймать ошибку globaly в Application_Error события внутри global.asax помощи? http://stackoverflow.com/questions/16884074/asp-net-mvc-application-error-handler-in-global-asax –

+0

Это похоже на asp.net MVC5? –

+0

Можете ли вы отправить код 'UseExceptionHandler'? – Mairaj

ответ

18

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

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

UseStatusCodePagesWithReExecute будет входить, где код состояния был сгенерирован 400-599, при условии, что тело ответа уже создано. source code in question показывает, как это определяется.

В вашем втором блоке кода, вы использовали 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}"); 
} 
+0

OK, большинство из того, что вы сказали, имеет смысл. Мой единственный запрос - какой код ошибки будет содержать эту строку кода: app.UseStatusCodePagesWithReExecute ("/ Error/{0}"); поймать, кроме 404? –

+2

Вот [окончательный ответ] (https://github.com/aspnet/Diagnostics/blob/dev/src/Microsoft.AspNetCore.Diagnostics/StatusCodePage/StatusCodePagesMiddleware.cs#L42) на этом - все, что имеет код состояния от 400 до 600 включительно, если тело ответа уже создано, будут обрабатываться UseStatusCodePages. Я обновлю ответ, чтобы отразить это. –

+0

Точный ответ thnx @MarkHughes – Drakoumel

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