【问题标题】:Asp.net Core UseExceptionHandler not working POST requestAsp.net Core UseExceptionHandler 不工作 POST 请求
【发布时间】:2018-08-07 05:08:50
【问题描述】:

在我的 .Net Core 2.0 应用程序中,我实现了 UseExceptionHandler 来全局处理异常。但是重定向只适用于 GET 方法,而 POST 方法总是返回 Status Code: 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# exception asp.net-core-mvc asp.net-core-2.0


    【解决方案1】:

    根据documentation

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

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

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

    【讨论】:

    • 您是否尝试过使用RouteAttribute?或者你在配置Mvc的时候试过MapRoute吗?
    • 我不确定,我们在 .Net Core 中需要这个吗?
    • @AnilD 如果没有HttpGet,您会遇到什么错误?我用Swashbuckle.AspNetCore 3.0 版进行了测试,没有HttpGet 也可以。
    • 我在使用Swashbuckle.AspNetCore version 2.4,得到“加载 API 定义失败。”
    • 使用[ApiExplorerSettings(IgnoreApi=true)] 使其工作,但不确定这种方法有多好......
    【解决方案2】:

    您应该能够从 Error 方法中删除 [HttpGet],因为它是造成不必要限制的原因。

    //[HttpGet]
    public IActionResult Get()
    {
        ....
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-30
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2020-10-12
      相关资源
      最近更新 更多