我的控制器返回统一的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。
答案 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;
}
}