Страница исключений разработчика в ASP.NET Core предоставляет подробную информацию об исключениях. Поскольку разработчикам нужна подробная информация об исключениях, а конечным пользователям — нет, шаблоны ASP.NET Core включают страницу исключений разработчика только тогда, когда приложение выполняется в среде разработки.
В этой статье рассказывается о промежуточном программном обеспечении страницы исключений разработчика в ASP.NET Core MVC и о том, как мы можем обрабатывать исключения как в средах разработки, так и в производственных средах в приложениях ASP.NET Core MVC.
Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена Visual Studio 2019. Если у вас еще нет копии, вы можете скачать Visual Studio 2019 здесь.
Создайте проект ASP.NET Core MVC в Visual Studio 2019.
Прежде всего давайте создадим проект ASP.NET Core в Visual Studio 2019. Выполнение этих шагов позволит создать новый проект ASP.NET Core MVC 5 в Visual Studio 2019.
- Запустите интегрированную среду разработки Visual Studio.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web App (Model-View-Controller)» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» выберите .NET 5.0 в качестве целевой платформы из раскрывающегося списка вверху. В поле «Тип аутентификации» оставьте значение «Нет» (по умолчанию).
- Убедитесь, что флажки «Включить Docker», «Настроить для HTTPS» и «Включить компиляцию среды выполнения Razor» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
- Нажмите Создать.
Будет создан новый проект ASP.NET Core MVC. Мы будем использовать этот проект для работы с промежуточным программным обеспечением Developer Exception Page в последующих разделах этой статьи.
Затем выполните шаги, описанные ниже, чтобы создать дополнительные контроллеры в вашем проекте:
- Щелкните правой кнопкой мыши папку решения «Контроллеры».
- Выберите Добавить -> Контроллер.
- В диалоговом окне «Добавить новый шаблонный элемент» выберите API в качестве шаблона (по умолчанию будет выбран MVC).
- Выберите пункт «API-контроллер с действиями чтения/записи».
- Нажмите Добавить.
- В диалоговом окне «Добавить новый элемент», показанном ниже, укажите имя для вашего нового контроллера.
- Нажмите Добавить.
Обработка исключений в ASP.NET Core MVC
Рассмотрим следующий фрагмент кода, который генерирует исключение в методе Configuration класса запуска:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints = >{
endpoints.MapControllerRoute(
name: "default", pattern:
"{controller=Home}/{action=Index}/{id?}");
});
throw new Exception("An error occurred while processing the request");
}
При запуске вышеуказанного приложения будет выдано исключение с сообщениями об ошибках, показанными на рисунке 1 ниже.
Как вы можете видеть на рисунке 1, отображаемые здесь сообщения об ошибках не являются ни подробными, ни удобными для разработчиков. Лучшим вариантом является использование страницы исключений разработчика.
Обработка исключений в среде разработки
Промежуточное программное обеспечение страницы исключений разработчика предоставляет удобные для разработчиков сообщения об ошибках, когда в приложении создается исключение. Эта информация поможет вам отслеживать ошибки, возникающие при запуске приложения в среде разработки.
Страница исключений разработчика группирует эту подробную информацию в пять разделов с вкладками — «Стек», «Запрос», «Файлы cookie», «Заголовки» и «Маршрутизация», как показано на рисунке 2 ниже.
Когда вы создаете новый проект ASP.NET Core MVC в Visual Studio, шаблон ASP.NET Core создает следующий код в методе Configuration класса Startup.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
else {
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints = >{
endpoints.MapControllerRoute(
name: "default", pattern:
"{controller=Home}/{action=Index}/{id?}");
});
}
Как показывает предыдущий код, страница исключений разработчика будет включена только тогда, когда приложение работает в среде разработки. Страница исключений разработчика не активируется, когда приложение работает в производственной среде. Естественно, цель состоит в том, чтобы избежать публичного отображения сообщений об исключениях.
Обратите внимание, что метод расширения UseDeveloperExceptionPage вызывается в начале конвейера, до вызова любого другого промежуточного программного обеспечения. Это сделано для того, чтобы гарантировать перехват исключений в следующем промежуточном программном обеспечении.
Обработка исключений в производственной среде
Для обработки исключений в производственной среде вам следует воспользоваться методом расширения UseExceptionHandler. В следующем листинге кода показано, как можно вызвать метод расширения UseExceptionHandler в методе Configuration класса Startup.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
else {
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints = >{
endpoints.MapControllerRoute(
name: "default", pattern:
"{controller=Home}/{action=Index}/{id?}");
});
}
Метод расширения UseExceptionHandler можно использовать для настройки пользовательских маршрутов обработки ошибок. Обратитесь к следующему фрагменту кода.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage(developerExceptionPageOptions);
}
else {
app.UseExceptionHandler("/Home/Error");
}
//Other code removed for brevity
}
При возникновении ошибки в приложении ASP.NET Core MVC элемент управления будет перенаправлен в /home/error.
Обратите внимание, что вы можете использовать лямбда-выражение в методе расширения UseExceptionHandler вместо использования пользовательской страницы обработчика исключений. Следующий фрагмент кода иллюстрирует, как этого можно достичь.
app.UseExceptionHandler(errorApp = >{
errorApp.Run(async context = >{
context.Response.StatusCode = (int)
HttpStatusCode.InternalServerError;
context.Response.ContentType = "text/html";
await context.Response.WriteAsync("<html
lang=\"en\"><body>\r\n");
await context.Response.WriteAsync("An error occurred...<br><br>\r\n");
await context.Response.WriteAsync("</body></html>\r\n");
await context.Response.WriteAsync(new string(' ', 512));
});
});
Страница исключений разработчика доступна после добавления промежуточного программного обеспечения страницы исключений разработчика в конвейер обработки запросов ASP.NET Core MVC. Шаблон по умолчанию в ASP.NET Core MVC включает это промежуточное ПО только для среды разработки. В производстве вы можете воспользоваться методом расширения UseExceptionHandler для настройки пользовательской обработки ошибок.