簡體   English   中英

Startup.cs 中的錯誤路由不會在 404 或 500 錯誤 ASP.NET Core MVC 時重定向到 controller

[英]Error routing in Startup.cs wont redirect to controller upon 404 or 500 error ASP.NET Core MVC

當發生 404 或 500 錯誤時,我希望我的 startup.cs class 重定向到我的錯誤 controller。

啟動.cs

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHttpContextAccessor accessor)
  {
     if (env.IsDevelopment())
     {
        app.UseDeveloperExceptionPage();
        app.UseExceptionHandler("/ErrorPages/500");
     }
     app.UseRouting();
     app.UseAuthentication();
     app.UseAuthorization();
     app.UseIPRestrictionService();
     app.Use(async (content, next) =>
     {
        await next();
        if (content.Response.StatusCode == 404 && !content.Response.HasStarted)
        {
            content.Request.Path = "/ErrorPages/404";
            await next();
        }
        if (content.Response.StatusCode == 500)
        {
            content.Request.Path = "/500";
            await next();
        }
     });
     app.UseHttpsRedirection();
     app.UseStaticFiles();
     app.UseEndpoints(endpoints =>
     {
        endpoints.MapContent();
        endpoints.MapControllers();
     });


     ContentExtensions.SetHttpContextAccessor(accessor);
     VisitorGroupManager.SetHttpContextAccessor(accessor);
     PageExtensions.SetHttpContextAccessor(accessor);
     //IsAuthenticatedCriterion.SetHttpContextAccessor(accessor);
  }

但是當檢測到 404 或 500 狀態代碼時設置了 content.Request.Path 時,URL 中的路徑不會改變。如何將其重定向到我的 controller,以便我可以應用我的邏輯。

錯誤控制器.cs

    [Route("ErrorPages")]
class ErrorController : Controller
{        
    [Route("500")]
    public IActionResult AppError()
    {
        return View();
    }

    [Route("404")]
    public IActionResult PageNotFound()
    {
        return View("~/Views/404.cshtml");
    }
}

為此,您需要一個錯誤 controller

在您的ErrorController.cs文件中

public class ErrorController : Controller
{
    private readonly ILogger<ErrorController> logger;

    public ErrorController(ILogger<ErrorController> logger)
    {
        this.logger = logger;
    }

    [Route("Error/{statusCode}")]
    public IActionResult HttpStatusCodeHandler(int statusCode)
    {
        var viewToReturn = string.empty;
        var statusCodeResult = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
        switch (statusCode)
        {
            case 404:
                ViewBag.ErrorMessage = "Sorry the resource you requested could not be found";
                logger.LogWarning($"404 Error Occured. Path = {statusCodeResult.OriginalPath}" + $"and QueryString = {statusCodeResult.OriginalQueryString}");
                viewToReturn = nameof(Notfound);
                break;
        }

        return View(viewToReturn ?? "defaultUnInterceptedErrorView");
    }

    [Route("Error")]
    [AllowAnonymous]
    public IActionResult Error()
    {
        var exceptionDetails = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
        logger.LogError($"The Path {exceptionDetails.Path} threw an exception" + $"{exceptionDetails.Error}");
        return View("Error");
    }
}

在你的 startup.cs 文件中

if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseStatusCodePagesWithReExecute("/Error/{0}");
        }

你也可以有你的NotFound.cshtml視圖,你可以監聽ViewBag.ErrorMessage的值(注意:ASP.NET Core 總是在AccountController.cs中搜索 Notfound 操作,但你可以在你的 startup.cs 中更改它)

然后您還可以繼續 case switch 語句以適應您計划攔截的所有狀態代碼錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM