ActionAttributeFilter与Delegatinghandler - 优点/缺点?

时间:2014-05-23 09:24:36

标签: asp.net-web-api2

我想从请求和传出的json中记录传入的json数据作为响应。

经过一番搜索后,我注意到可以使用自定义的ActionAttributeFilter和DelegatingHandler。 它们有什么优点/缺点吗?

2 个答案:

答案 0 :(得分:13)

优点/缺点取决于您的需要。

委托处理程序在Web API请求处理的层次结构中比ActionAttributeFilter高得多。如果您实现了Delegating Handler,那么您正在创建一个Message处理程序,而如果您创建了Action过滤器,那么您正在创建在管道中的action方法之前运行的过滤器。

虽然消息处理程序在管道中较早运行,但它在处理时可能是有利的 尽早提出要求。消息处理程序针对所有操作方法或至少路径的所有操作方法运行。在选择消息处理程序来解决问题时应该考虑这一点。操作过滤器可以应用于各个操作方法,Controller中的所有方法,或所有控制器中的所有方法 将过滤器配置为全局过滤器。

答案 1 :(得分:2)

对于您的特定要求,即记录请求和响应,您应该使用委托处理程序。

这样做的好处是可以同时从请求和响应中构建日志对象。这是因为委托处理程序围绕请求和响应运行,因此可以访问这两者。

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
  var log = new Log { Url = request.RequestUri };     
  var response = await base.SendAsync(request, cancellationToken);
  log.ContentLength = response.ContentLength;
  this.LogAsync(log);
  return response;
}

使用ActionFilter,你可以拥有在请求之前和之后执行的方法,但不是全部,所以你需要考虑以某种方式关联日志。