Как использовать UseExceptionHandler при запуске mvc без перенаправления пользователя? - PullRequest
0 голосов
/ 16 января 2020

У меня есть приложение ASP. NET Core 2.1 MVC, и я пытаюсь вернуть отдельное представление html при возникновении исключения. Причина этого в том, что в случае ошибок мы не хотим, чтобы Google регистрировал перенаправления на страницу ошибок для нашего SEO (я пропустил настройки разработки, чтобы прояснить ситуацию).

Наш стартап содержал this:

app.UseExceptionHandler("/Error/500"); // this caused a redirect because some of our middleware.
app.UseStatusCodePagesWithReExecute("/error/{0}"); 

Но мы хотим предотвратить перенаправление, поэтому нам нужно изменить UseExceptionHandler. Я попытался использовать ответ из этого вопроса , как показано ниже:

app.UseExceptionHandler(
            options =>
            {
                options.Run(
                    async context =>
                    {
                        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                        context.Response.ContentType = "text/html";
                        await context.Response.WriteAsync("sumtin wrong").ConfigureAwait(false);

                    });
            });

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

Как я могу вернуть стилизованное представление в случае исключение, без перенаправления пользователя?

РЕДАКТИРОВАТЬ: UseExceptionHandler не вызывает перенаправления, это было вызвано ошибкой в ​​некоторых из наших промежуточных программ.

1 Ответ

1 голос
/ 16 января 2020

Как я могу вернуть стилизованное представление в случае исключения, без перенаправления пользователя?

Вы почти у цели. Вы можете переписать (вместо перенаправления) путь, а затем подать HTML в соответствии с текущим путем.

Допустим, у вас есть хорошо стилизованная страница sth-wrong.html в папке wwwroot/. Измените код, как показано ниже:

app.UseExceptionHandler(appBuilder=>
{
    // override the current Path
    appBuilder.Use(async (ctx, next)=>{
        ctx.Request.Path = "/sth-wrong.html";
        await next();
    });
    // let the staticFiles middleware to serve the sth-wrong.html
    appBuilder.UseStaticFiles();
});

[Изменить] :

В любом случае, где я могу использовать макет моей главной страницы? ?

Да. Но поскольку макет страницы - это функция просмотра, принадлежащая MVC, здесь можно включить еще одну MVC ветку

  1. Сначала создайте файл Controllers/ErrorController.cs:

    public class ErrorController: Controller
    {
        public IActionResult Index() => View();
    }
    

    и связанный файл Views/Error/Index.cshtml:

    Ouch....Something bad happens........
    
  2. Добавить ветку MVC в промежуточный конвейер:

    app.UseExceptionHandler(appBuilder=>
    {
        appBuilder.Use(async (ctx, next)=>{
            ctx.Request.Path = "/Error/Index";
            await next();
        });
        appBuilder.UseMvc(routes =>{
            routes.MapRoute(
                name: "sth-wrong",
                template: "{controller=Error}/{action=Index}");
        });
    });
    

Демонстрация:

enter image description here

...