首页 > 解决方案 > Asp.net Core UseExceptionHandler 不工作 POST 请求

问题描述

在我的 .Net Core 2.0 应用程序中,我实现了 UseExceptionHandler来全局处理异常。但重定向只适用于 GET 方法,而 POST 方法总是返回状态码:404;未找到

这是我的 Startup.cs 配置方法

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
ILoggerFactory loggerFactory)
{
        app.UseCors(builder => builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        if (env.IsDevelopment())
        {
            app.UseStatusCodePages();
            app.UseDatabaseErrorPage();
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
            app.UseExceptionHandler("/api/v1/Error");
        }
        else
        {
            app.UseExceptionHandler("/api/v1/Error");
        }

        app.UseMvc();
        app.UseSwagger();

        app.UseSwaggerUI(c =>
        {
            c.RoutePrefix = "docs";
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
            c.SwaggerEndpoint("/[]virtualDir]/swagger/v1/swagger.json", "V1 Docs");
        });
    }

错误控制器是

[Route("api/v1/[controller]")]
public class ErrorController : Controller
{
    private readonly IErrorLoggerService _errorLoggerService;

    public ErrorController(IErrorLoggerService errorLoggerService)
    {
        _errorLoggerService= errorLoggerService;
    }
    [HttpGet]
    public IActionResult Get()
    {
        // Get the details of the exception that occurred
        var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
        var errorLog = new ErrorLog();

        if (exceptionFeature != null)
        {
            // Get which route the exception occurred at
            var routeWhereExceptionOccurred = exceptionFeature.Path;

            // Get the exception that occurred
            var exceptionThatOccurred = exceptionFeature.Error;

            // TODO: save exception in db
            errorLog = new ErrorLog
            {
                Application = routeWhereExceptionOccurred,
                Source = exceptionThatOccurred.Source,
                CreatedDate = DateTime.Now,
                Host = exceptionThatOccurred.InnerException?.ToString(),
                Type = exceptionThatOccurred.Message,
                Detail = exceptionThatOccurred.StackTrace
            };
            _errorLoggerService.Save(errorLog);
            return Json(errorLog);
        }

        return Json(errorLog);
    }
}

如何解决?

标签: c#exceptionasp.net-core-mvcasp.net-core-2.0

解决方案


根据文档

在 MVC 应用程序中,不要使用 HTTP 方法属性(例如 HttpGet)装饰错误处理程序操作方法。显式动词阻止某些请求到达方法。允许匿名访问该方法,以便未经身份验证的用户能够接收错误视图。

所以,你的错误可能HttpGet属性上。不要使用它,而是遵循文档:

[Route("")]
[AllowAnonymous]
public IActionResult Get()
{
    ....
}

推荐阅读