【问题标题】:Get HttpStatus code from IActionFilter in .Net Core 2.0从 .Net Core 2.0 中的 IActionFilter 获取 HttpStatus 代码
【发布时间】:2018-08-28 12:58:18
【问题描述】:

我在 ASP.NET core 2.0 中有过滤器属性,请参阅下面的代码 sn-p。这里的问题是我总是得到状态码是 200。

即使实际状态码是 500,我也得到 200。我如何获得实际状态码?

public void OnActionExecuted(ActionExecutedContext context)
{
    try
    {
        var controller = context.Controller as APIServiceBase;
        var statusCode = controller.Response.StatusCode;
        ..
        ..
    }
    catch { }

}

【问题讨论】:

  • 没有时间深入研究这个,但你看过exception or resource filters吗?似乎任何 500 系列状态代码都会被视为“异常”。
  • 您是否考虑过改用IResultFilter

标签: c# asp.net-core asp.net-core-2.0 asp.net-core-webapi


【解决方案1】:

非常有趣的问题。动作过滤器在动作本身之后执行。问题是该操作返回的IActionResult 在此阶段尚未执行。您可以通过返回 IActionResult 的自定义实现并检查其 ExecuteResultAsync 方法是否在操作过滤器的 OnActionExecuted() 之后执行来检查它。

由于响应由IActionResult(包括状态代码)填充,您不应期望Response.StatusCode 已在操作过滤器中设置。

要解决这个问题,你应该稍后在 ASP.Net Core 管道中执行你的逻辑,动作过滤器不适合它。您可以在请求管道中添加自定义中间件(Startup.Configure() 方法):

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        await next.Invoke();
        var statusCode = context.Response.StatusCode;
        // ...
    });

    app.UseMvc();
}

确保在调用 app.UseMvc() 之前添加它。如果需要,您可以将委托逻辑包装到单独的类中。

【讨论】:

    【解决方案2】:

    正如 CodeFuller 提出的,您的操作可能尚未执行。 但是,如果您想保留过滤模式以仅将其应用于特定方法,则可以使用响应的 OnCompleted 方法:

    // Called on incoming request
    public void OnActionExecuting(ActionExecutedContext context)
    {
        context.HttpContext.Response.OnCompleted(async () => {
            // Executed once the response is sent
    
            var status = context.HttpContext.Response.StatusCode;
    
            // Work here
            // Be careful on Transient or Scoped injections, they may already be disposed
            // If you need a DbContext, instanciate it by injecting 
            //    DbContextOptions<MyDbContext> earlier in the code
    
        });
    }
    

    此方法适用于大多数类型的过滤器,因此您可以根据需要使用任何过滤器输入。

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 2023-03-08
      • 1970-01-01
      • 2018-01-29
      • 2022-01-22
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多