Фон:
Я настраиваю обработку ошибок в приложении ASP. NET Core 2.2 MVC. В среде разработки я использую app.UseDeveloperExceptionPage();
, а в производстве - app.UseExceptionHandler("/Error/Index");
. Я перехожу на правильную страницу ошибки во время запросов, отличных от AJAX (отправка обычной формы), в зависимости от среды.
Если на сервере возникает исключение во время запроса AJAX, я хочу, чтобы приложение отображать правильную страницу ошибки в зависимости от среды.
Я уже настроил все, что описано выше, как вы можете видеть в моих примерах кода ниже.
Проблема / проблема :
Хотя это работает (хотя все еще необходимо выполнить TODO в функции InitializeGlobalAjaxEventHandlers
), у меня есть некоторые проблемы.
С не- AJAX вызовами в MVC , похоже, что существует «официальный / правильный» способ сделать это с помощью app.UseDeveloperExceptionPage();
и app.UseExceptionHandler("/Error/Index");
, который автоматически перенаправляет программу на страницу с ошибкой. Однако с окончанием обработки ошибок AJAX я не чувствую такой уверенности, потому что я собрал ее вместе с частями из различных решений, которые я исследовал. Я волнуюсь, я не знаю, что могло go неправильно.
Вопрос:
Это правильный способ обработки ошибок во время AJAX запросов в MVC? Может, что-то go не так с этой настройкой? Это каким-то образом неправильно или слишком далеко от общепринятых стандартов?
Код:
Startup.cs> Метод настройки:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//using build config to use the correct error page: https://stackoverflow.com/a/62177235/12300287
//Reason why we don't use environmental variables is because we can't guarantee access to clients'
//machines to create them.
#if (DEVELOPMENT || STAGING)
app.UseDeveloperExceptionPage();
#else
app.UseExceptionHandler("/Error/Index");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
#endif
app.UseHttpsRedirection();
app.UseStaticFiles();
//app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=UserAccess}/{action=Index}/{id?}");
});
}
ErrorController .cs:
public class ErrorController : Controller
{
[AllowAnonymous]
public IActionResult Index()
{
IExceptionHandlerPathFeature exceptionDetails = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
Exception exception = exceptionDetails?.Error; // Here will be the exception details.
Error model = new Error();
model.ID = exception.HResult;
model.Message = exception.Message;
model.Path = exceptionDetails.Path;
return View(model);
}
}
Global AJAX обработчик события ошибки (оператор if
предназначен для обработки аутентификации):
function InitializeGlobalAjaxEventHandlers() {
$(document).ajaxError(function (event, xhr, ajaxSettings, thrownError) {
//status is set in the [AuthorizeAjax] action filter if user isn't authenticated
if (xhr.status == 403) {
var response = $.parseJSON(xhr.responseText);
window.location = response.redirectUrl;
}
//the document HTML is replaces by responseText value, which contains the HTML of error page
document.write(xhr.responseText);
//TODO: will need to display an error page if responseText is empty, which
//can happen if an AJAX request doesn't reach the server (for example: if URL is incorrect).
});
}