#asp.net-core #error-handling
#asp.net-ядро #обработка ошибок
Вопрос:
В моем приложении у меня есть набор ошибок, которые являются «ожидаемыми», и поэтому они не должны перенаправлять пользователя на полную страницу ошибок при их возникновении. Например, я хотел бы показать сообщение об ошибке в красном поле над текущей страницей.
Я могу легко обнаружить ошибку в действии модели и показать сообщение в текущем представлении, но мне было интересно, как сделать это глобально.
Я попробовал пользовательское промежуточное программное обеспечение с TempData и фильтр с ModelState, но не могу понять, как на самом деле передать данные об ошибке обратно на текущую страницу.
Это работает для одной модели (установка данных об ошибке в TempData):
public async Task<IActionResult> OnPost() {
try {
// methodThatThrows
}
catch (ApplicationError e) {
TempData["Error"] = e.Message;
return RedirectToPage("Current_Page");
}
return RedirectToPage("Other_Page");
}
По какой-то причине это не работает (в глобальном промежуточном программном обеспечении), так как TempData пуст, когда перенаправление завершается. Кроме того, настройка промежуточного программного обеспечения на самом деле не работает с отображением других, более критических ошибок на обычной странице ошибок:
public class ApplicationErrorMiddleware {
private readonly RequestDelegate _next;
private readonly ITempDataDictionaryFactory _tempFactory;
public ApplicationErrorMiddleware(RequestDelegate next, ITempDataDictionaryFactory tempFactory) {
_next = next;
_tempFactory = tempFactory;
}
public async Task InvokeAsync(HttpContext httpContext) {
try {
await _next(httpContext);
}
catch (ApplicationError ex) {
HandleError(httpContext, ex);
}
}
private void HandleError(HttpContext context, ApplicationError error) {
var tempData = _tempFactory.GetTempData(context);
tempData.Add("Error", error.Message);
context.Response.Redirect(context.Request.Path);
}
}
Комментарии:
1. Как настроены ваши временные данные? Включено ли состояние сеанса? Если да, то каков ваш порядок
Startup.Configure
, является ли UseSession до или после добавления вашегоApplicationErrorMiddleware
?
Ответ №1:
По совету @hiiru я долго искал варианты конфигурации, чтобы найти рабочее решение.
Моей проблемой был пропущенный вызов из промежуточного программного обеспечения HandleError-method:
private void HandleError(HttpContext context, ApplicationError error) {
var tempData = _tempFactory.GetTempData(context);
tempData.Add("Error", error.Message);
tempData.Save(); // this call was missing
context.Response.Redirect(context.Request.Path);
}
После его добавления временные данные отправляются с перенаправлением обратно на исходную страницу. Обратите внимание, что при этом используются временные данные на основе cookie по умолчанию, поэтому конкретная настройка не требуется.
Теперь это работает, но, возможно, это не лучший способ сделать это.
Комментарии:
1. Спасибо за ваше обновление с решением!, также я узнал, как
ITempDataDictionaryFactory
можно использовать (пока не было необходимости использовать его самому)