ActionFilter Response.StatusCode始终为200

jag*_*jag 2 c# asp.net-core-mvc

我正在尝试设置一个动作过滤器,只有StatusCodeHttpContext.Response302 的情况下才会执行某些操作.

我希望能够在OnActionExecuting方法中做到这一点,但StatusCode总是如此200.

ActionFilter 码:

public class CustomFilter : IActionFilter
{
   public void OnActionExecuting(ActionExecutingContext context)
    {
        // do some setup
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        if (context.HttpContext.Response.StatusCode == StatusCodes.Status302Found)
        {
            // never get here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的Action方法:

public IActionResult Redirect()
{
    return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)

和注册ActionFilterstartup:

public void ConfigureServices(
    IServiceCollection services)
{
    services.AddMvc(
        options =>
        {
            options.Filters.Add(new CustomFilter());
        });
}
Run Code Online (Sandbox Code Playgroud)

我已经检查了浏览器,它正确返回302并进行重定向.我也试过使用IAsyncActionFilter界面,但有同样的问题.

如何ActionFilter将()重定向的响应应用于?

为什么这不起作用?

编辑:哎呀我把他们弄错了.实际上我仍然得到这个问题...

And*_*rei 5

在实际生成响应之前,您正在查看响应的状态代码.OnActionExecuting称为前执行该操作,所以没有状态代码设置呢.状态代码的默认值为 200,这就是您所看到的.

为了能够看到实际状态代码等行动已经分配给任何答复,则需要看OnActionExecuted,这后运行的动作.

更新.

另一个问题可能是Core框架中的动作过滤器在执行操作之前和之后运行.因此,尚未处理响应,并且未在http响应对象中设置状态代码.

适用于您的用例的方法似乎是 IResultFilter.OnResultExecuted


Ant*_*mas 5

您可以尝试将ActionExecutedContext.Result对象转换为对象ObjectResultStatusCode从中检索对象。

public void OnActionExecuted(ActionExecutedContext context)
{
    var statusCode = (context.Result as ObjectResult)?.StatusCode
}
Run Code Online (Sandbox Code Playgroud)

  • 更好的方法是尝试将其转换为“IStatusCodeResult”。 (4认同)