Я изо всех сил пытался настроить глобальную обработку ошибок для моего веб-приложения ASP.Net Core MVC. Я пытался применить следующую статью, но мне не повезло.
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-7.0
Запуск приложения с помощью IIS Express в режиме отладки.
На данный момент я просто создаю новый проект веб-приложения. В частности, веб-приложение ASP.Net Core 7.0 (модель-представление-контроллер). Единственный код, который я изменил по сравнению с тем, который вы получаете по умолчанию при создании нового проекта, это следующий.
Программа.cs
// Configure the HTTP request pipeline.
//if (!app.Environment.IsDevelopment())
//{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
//}
Контроллеры/HomeController.cs
//added HttpGet attribute to main index action.
[HttpGet]
public IActionResult Index()
{
//throw an application exception to test error handling
throw new ApplicationException("This is an error");
return View();
}
Модели/ErrorViewModel.cs
//Added class attributes and PageModel inheritance
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
[IgnoreAntiforgeryToken]
public class ErrorViewModel : PageModel
public string? RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
//added OnGet method
public void OnGet()
{
string thisIsDumb = "dumb";
}
Shared/Error.cshtml — без изменений. Если я добавлю @page вверху, это нарушит использование ViewData["Title"], т.е. ViewData["Title"] = "Error" больше не работает. ViewData становится нулевым.
Я чувствую, что это должно быть более прямолинейно, но я явно что-то упускаю. Я пытаюсь заставить любое необработанное исключение, возникающее в моем веб-приложении, заполниться на веб-странице с подробными сведениями об ошибках. Мне бы очень хотелось иметь некоторую глобальную обработку ошибок, но я просто не могу заставить базовый OnGet OnPost работать в модели, и я не знаю, как передать любую форму исключения в ErrorViewModel для использования представлением.
@QingGuo Я понял. В примере кода, по крайней мере, на мой взгляд, не очень хорошо указано, что он предназначен только для Blazor (кажется). MVC отличается тем, что ExceptionHandler в примере кода обращается только к одному маршруту и действию.
На случай, если кто-то еще запутается в этом, пример кода в связанной статье Обработка ошибок в ASP.NET Core, похоже, предназначен для Blazor, а не MVC. Следующий пункт из указанной статьи является указателем на это.
Для MVC примените атрибуты HTTP-глагола к нескольким действиям. Например, используйте [HttpGet] для обработки исключений GET и используйте [HttpPost] для обработки POST-исключения.
Для приложений MVC, когда вы добавляете следующий код, вы направляете все необработанные ошибки в логике вашего приложения MVC в действие при ошибке вашего контроллера по умолчанию.
Программа.cs
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Default/Error");
app.UseHsts();
}
Хотя в указанной статье есть код
app.UseExceptionHandler("/Error");
Кажется, отсутствие контроллера «по умолчанию» в маршруте этого кода больше связано с Blazor. Для MVC необходимо добавить отсутствующий контроллер «по умолчанию» в пути маршрутов. По крайней мере, чтобы я мог заставить его работать.
С этого момента ваш контроллер по умолчанию будет выполнять примерно следующее действие:
Контроллеры/DefaultController.cs
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
string exceptionMessage = string.Empty;
string typeOfException = string.Empty;
var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
if (exceptionHandlerPathFeature != null)
{
if (exceptionHandlerPathFeature.Error != null)
{
typeOfException = exceptionHandlerPathFeature.Error.GetType().Name;
exceptionMessage = exceptionHandlerPathFeature.Error.Message;
}
}
// ... Other Code used to update your ErrorViewModel ...
ErrorViewModel model = new ErrorViewModel();
model.RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
model.SessionID = HttpContext.Session.Id ?? "No Session ID Found"; //Extended ErrorViewModel
model.ExceptionType = typeOfException; //Extended ErrorViewModel
//Resolves to the /Views/Shared/Error.cshtml view.
return View(model);
}
MVC просто отличается от того, что показано в статье, на которую есть ссылка, хотя предполагается, что он предназначен для обучения как MVC, так и Blazor.
Надеюсь, это поможет кому-то еще запутаться.
На что похож ваш Program.cs? Не могли бы вы поделиться больше кода? Почему вы хотите изменить модель ErrorViewModel на страницу бритвы?