我需要记录(而非跟踪)来自webAPI(v1)的所有请求和响应,并将信息存储在数据库中。
我认为最合适的地方是MessageHandler
。
所以:
public class LogRequestAndResponseHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken)
.ContinueWith(task =>
{
var MyRequest = request;
var MyResponse = task.Result;
var responseBody = task.Result.Content;
//log db....
return task.Result;
}, cancellationToken);
}
}
请注意我在<{em} request
之后阅读response
和SendAsync
(在续集中)因为我想要单个写入DB。
可是:
我心想:&#34;如果我能在同一个地方(在MessageHandler中)提取方法绑定信息&#34;
那就太好了例如,请考虑以下代码:
[HttpGet]
[ActionName("GetGraph")]
public HttpResponseMessage BlaBla(string Member_ID, int DateDiff)
{
//...
}
这个要求:
http://es.com/api/claims/GetGraph?Member_ID=123&DateDiff=5&NotExists=2
问题:
是否有可能(以及如何)提取这样的东西:
Member_ID
的匹配123
DateDiff
的匹配5
NotExists
的非 -match-able 2
这个阶段:
答案 0 :(得分:1)
使用消息处理程序记录原始请求和响应是正确的,但是您是否能够使用上面的代码记录请求正文?如果您实际将主体绑定到操作方法参数,则参数绑定实际上将读取并清空请求主体流。所以,我不认为你在任务延续中记录请求体的想法是可行的。
在消息处理程序中记录有关绑定的数据很复杂,并且很大程度上取决于您的操作方法。消息处理程序请求处理在模型绑定之前运行,并且当响应处理部分运行时,模型的概念不存在,因为序列化已经完成。顺便说一下,当您使用JSON有效负载时,请查看我的博客文章,以检测请求中的额外字段。
http://lbadri.wordpress.com/2014/01/28/detecting-extra-fields-in-asp-net-web-api-request/
您可以编写一个动作过滤器来查看模型中的额外字段,如该帖子中所述并将该信息存储在请求字典中(Request.Properties
)并稍后在消息处理程序中选择并写入到数据库。但这并不是直截了当的。
或者,查看内置跟踪器以查看它是否有用。