如何在ASP.NET Core中间件中指定响应类型

时间:2017-03-30 15:39:16

标签: asp.net-web-api asp.net-core

我的控制器返回统一的RequestResult:

public Task<RequestResult> SomeAction()
{
  ...
  return new RequestResult(RequestResultType.NotFound);
}

public class RequestResult
{
  public RequestResultType Type { get;set; }
  ... //actual data
}

public enum RequestResultType
{
   Success = 1,
   NotFound = 2
}

所以基本上RequestResult结合了实际的Action数据和错误类型(如果它发生)。现在我需要在某些时候指定响应类型,以防Action返回Error。我最好的猜测是使用中间件:

public class ResponseTypeMiddleware
{
  private readonly RequestDelegate next;

  public ResponseTypeMiddleware(RequestDelegate next)
  {
    this.next = next;
  }

  public async Task Invoke(HttpContext context)
  {
    await next(context);

    var response = context.Response.Body; //how to access object?
  }
}

但我无法弄清楚该如何处理它。我最想做的是检查响应是否为RequestResult类型,然后指定ResponseType等于BadRequest。但我不知道我怎么能在这里做,因为我只是一个流。在结果被序列化之前,我可以更早地劫持管道(控制器?)。

P上。 S.我之间没有直接在Action中使用Controller.BadRequest的原因是我的Action的逻辑是通过CQRS命令/查询处理程序实现的,所以我没有直接访问Controller。

1 个答案:

答案 0 :(得分:1)

当你要处理控制器的动作结果(MVC)时,最好的方法是在这里使用ActionFilter或ResultFilter,而不是中间件。 ASP.NET Core中的Filters是MVC的一部分,因此了解控制器,操作等。中间件是一种更常见的概念 - 它是应用程序请求 - 响应管道中的附加链。

public class SampleActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // do something before the action executes
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // do something after the action executes

        // get or set controller action result here
        var result = context.Result as RequestResult;
    }
}