【问题标题】:Why is there no access to context.Result.StatusCode in Action and Result filters?为什么在 Action 和 Result 过滤器中无法访问 context.Result.StatusCode?
【发布时间】:2021-05-11 13:01:59
【问题描述】:

我正在尝试编写一个动作或结果过滤器,如果状态代码 >= 400,它会自动执行某些操作。ActionExecutedContext.Result 属性看起来应该提供对状态代码的访问:

但无法访问状态码:

这是设计使然吗?获取实际状态码的最佳方式是什么?

【问题讨论】:

  • 请记住,调试器会向您显示有关对象的具体运行时类型的详细信息。编译器希望您使用 已声明的类型 的事物。这些并不总是相同的。因此,IActionResult 不一定具有 StatusCode 属性,而 BadRequestResult 实例则具有。
  • 这是asp.net核心吗?原来我在回答中有点假设核心。

标签: c# .net-core action-filter


【解决方案1】:

此时,IActionResult 尚未执行,因此状态码可能会发生变化。 This one 基本上有这个问题的答案:做一个中间件,让它检查状态码。

【讨论】:

    【解决方案2】:

    在这种情况下,您应该查看响应状态代码。

    var statusCode = context.HttpContext.Response.StatusCode;

    这是我刚刚做的一个测试,它正在工作:

        public void OnActionExecuted(ActionExecutedContext context)
        {
            var statusCode = context.HttpContext.Response.StatusCode;
    
            if (statusCode == StatusCodes.Status400BadRequest)
            {
                //DO SOMETHING
            }
        }
    

    OnActionExecuted 结果应该已经存在,但您需要的似乎更多 OnResultExecuted。

    【讨论】:

    • 我最不想做的事情是用一堆 if 语句来处理不同的具体结果类型。另外,context.HttpContext.Response.StatusCode 始终为 200,这是默认的 http 响应状态。
    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2016-06-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多