ASP.NET Core 3.0 перенаправляет запросы HTTP 4XX и 5XX на настраиваемые страницы ошибок, сохраняя код ошибки - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь перенаправить HTTP-запросы с кодом ошибки 4XX или 5XX на пользовательскую страницу ошибки, сохраняя при этом код ошибки на уровне запроса. Я также хочу перенаправить исключения на пользовательскую страницу ошибки с кодом ошибки 500.

Для этого я использовал в своем файле запуска "app.UseStatusCodePagesWithReExecute (" / error / {0} "); app.UseExceptionHandler( "/ ошибка / 500");»связан с контроллером ошибок.

Хорошо работает часть об исключениях. Мне также удается перенаправить несуществующие маршруты на мою пользовательскую страницу, сохраняя ошибку 404.

Однако я не могу перенаправить следующие действия на свои пользовательские страницы ошибок:

  • return NotFound ()
  • return BadRequest ()
  • return StatusCode (404)

Какое техническое решение будет применяться для достижения этой цели?

Вот функция настройки моего файла запуска:

app.UseStatusCodePagesWithReExecute("/error/{0}");
app.UseExceptionHandler("/error/500");

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "Error-StatusCode-Route",
        pattern: "error/{statusCode}",
        defaults: new { controller = "Error", action = "InternalServerError" }
);

endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

1 Ответ

0 голосов
/ 08 ноября 2019

Вы можете настроить промежуточное ПО для работы с ним:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{   
    app.UseStatusCodePagesWithReExecute("/error/{0}");
    app.UseExceptionHandler("/error/500");     
    app.Use(async (context, next) =>
    {
        await next();
        var code = context.Response.StatusCode; 
        var newPath = new PathString("/error/"+code);
        var originalPath = context.Request.Path;
        var originalQueryString = context.Request.QueryString;
        context.Features.Set<IStatusCodeReExecuteFeature>(new StatusCodeReExecuteFeature()
        {
            OriginalPathBase = context.Request.PathBase.Value,
            OriginalPath = originalPath.Value,
            OriginalQueryString = originalQueryString.HasValue ? originalQueryString.Value : null,
        });

        // An endpoint may have already been set. Since we're going to re-invoke the middleware pipeline we need to reset
        // the endpoint and route values to ensure things are re-calculated.
        context.SetEndpoint(endpoint: null);
        var routeValuesFeature = context.Features.Get<IRouteValuesFeature>();
        routeValuesFeature?.RouteValues?.Clear();

        context.Request.Path = newPath;
        try
        {
            await next();
        }
        finally
        {
            context.Request.QueryString = originalQueryString;
            context.Request.Path = originalPath;
            context.Features.Set<IStatusCodeReExecuteFeature>(null);
        }              
    });
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    //...
}

Для вашего ErrorController:

public class ErrorController : Controller
{
    // GET: /<controller>/
    public IActionResult InternalServerError()
    {
        return View();
    }
    [Route("error/404")]
    public IActionResult StatusCode404()
    {
       //redirect to the StatusCode404.cshtml
        return View();
    }
    [Route("error/400")]
    public IActionResult StatusCode400()
    {
        return View();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...