【发布时间】:2014-05-23 09:24:36
【问题描述】:
我想记录来自请求的传入 json 数据和传出 json 作为响应。
经过一番搜索,我注意到自定义的 ActionAttributeFilter 和 DelegatingHandler 都可以使用。 它们有什么优点/缺点吗?
【问题讨论】:
标签: asp.net-web-api2
我想记录来自请求的传入 json 数据和传出 json 作为响应。
经过一番搜索,我注意到自定义的 ActionAttributeFilter 和 DelegatingHandler 都可以使用。 它们有什么优点/缺点吗?
【问题讨论】:
标签: asp.net-web-api2
优点/缺点取决于您的需要。
委托处理程序在 Web API 请求处理的层次结构中比 ActionAttributeFilter 高得多。如果您实现 Delegating Handler,您将创建一个消息处理程序,而如果您创建 Action 过滤器,您将创建在管道中的操作方法之前运行的过滤器。
虽然消息处理程序在管道中运行得更早,但它在处理 尽早提出请求。消息处理程序为所有操作方法运行,或者至少为路由的所有操作方法运行。在选择消息处理程序来解决问题时应该考虑这一点。动作过滤器可以应用于单个动作方法、控制器中的所有方法或跨所有控制器的所有方法 将过滤器配置为全局过滤器。
【讨论】:
对于您的特定要求,即记录请求和响应,您应该使用委托处理程序。
这样做的好处是您可以同时从请求和响应构建日志对象。这是因为委托处理程序围绕请求和响应运行,因此可以访问两者。
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,您可以拥有将在请求之前和之后执行但不能始终执行的方法,因此您需要考虑以某种方式关联日志。
【讨论】: