Как перенаправить пользователя на страницу ошибок и регистрировать ошибки в файле журнала в ядре .NET - PullRequest
0 голосов
/ 14 февраля 2019

Я работаю над основным веб-приложением .NET, и мое требование состоит в том, чтобы обрабатывать ошибки глобально.

Поэтому, чтобы добиться такого поведения, я попытался использовать сборку промежуточного программного обеспечения UseExceptionHandler вместе с ExceptionHandlerOptions .

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler(new ExceptionHandlerOptions {
                    ExceptionHandlingPath = "/Home/Error",
                    ExceptionHandler = async (context) => {
                        var exceptionFeature = context.Features.Get<IExceptionHandlerFeature>();
                        if (exceptionFeature != null)
                        {
                            Log.Error(exceptionFeature.Error, exceptionFeature.Error.Message);
                        }
                    }
                });
            }
     }

Выше кода регистрируйте ошибки в файле журнала, но никогда не перенаправляйте пользователя на страницу ошибок.Когда я удаляю функцию ExceptionHandler, она работает нормально и перенаправляет пользователя на страницу ошибки.Исправьте меня, если я что-то пропустил.

Я ожидаю, что пользователь должен перенаправить на страницу ошибки, когда произойдет любое необработанное исключение, и зарегистрирует ошибку в файле журнала.

Мой обходной путь для этой проблемы:

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
        }

HomeController.cs

public async Task<IActionResult> Error(string errorId)
        {
            var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerFeature>();
            if (exceptionFeature != null)
            {
                Log.Error(exceptionFeature.Error, exceptionFeature.Error.Message);
            }
       }

Приведенное выше решение работает для меня, но является ли хорошей практикой регистрировать глобальную ошибку в контроллере?Любой вывод будет оценен.

Спасибо!

1 Ответ

0 голосов
/ 14 февраля 2019

Два свойства являются взаимоисключающими, ExceptionHandlingPath = "/ Home / Error", ExceptionHandler, т.е. любое из них будет применено, и поэтому перенаправление не происходит в home / error.Если вы удалите exceptionHandler, он будет работать для вас, однако вам нужно будет выполнить вход в контроллер, который является частью 2-й реализации, которую вы сделали, и нет никакого вреда в том, чтобы регистрировать его таким образом, пока этот контроллер / действие не выполнитобработка всего.

когда я говорю все, это означает, что есть 401 ошибка, 404 ошибки, которые не будут обработаны текущим подходом, и для этого вы должны использовать базовый подход statusCode.

лучший подход заключается в том, что у вас есть несколько реализаций страниц с ошибками: 1. 404: там, где маршрут не существует 2. 500: ошибка приложения (все случаи) 3 401: если есть какой-то типзадействована авторизация.

.net core предоставляет множество механизмов обработки ошибок (включая Globalfilterattributes для обработки исключений).Тем не менее, если у вас есть общедоступное приложение, вы должны показать пользователю дружественную страницу с ошибкой и сохранить журнал.

Вы можете прочитать об этом здесь

...