编程语言
首页 > 编程语言> > c# – 从.Net Core 2.0中的IActionFilter获取HttpStatus代码

c# – 从.Net Core 2.0中的IActionFilter获取HttpStatus代码

作者:互联网

我在ASP.NET核心2.0中有过滤器属性,请参阅下面的我的代码片段.这里的问题是我总是得到状态码是200.

即使实际状态代码是500,那么我也得到200.如何获得实际状态代码?

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

}

解决方法:

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

由于响应由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()之前添加它.如果需要,您可以将委托逻辑包装到单独的类中.

标签:c,asp-net-core,asp-net-core-2-0,asp-net-core-webapi
来源: https://codeday.me/bug/20190522/1153105.html