C# WebAPI-MessageHandler上的日志绑定信息?

C# WebAPI-MessageHandler上的日志绑定信息?,c#,asp.net-web-api,C#,Asp.net Web Api,我需要记录(而不是跟踪)来自webAPI(v1)的所有请求和响应,并将信息存储在DB中 我认为最合适的地方是通过MessageHandler 因此: public class LogRequestAndResponseHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, Cancell

我需要记录(而不是跟踪)来自webAPI(v1)的所有请求和响应,并将信息存储在DB中

我认为最合适的地方是通过
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);
    }
}
这项请求:

http://es.com/api/claims/GetGraph?Member_ID=123&DateDiff=5&NotExists=2
问题:

是否有可能(以及如何)提取如下内容:

  • 用户发送的可匹配的
    成员ID
    123
  • 用户发送的可匹配值
    DateDiff
    与值
    5
  • 用户发送的-可匹配的
    NotExists
    与值
    2
这个阶段:


使用消息处理程序记录原始请求和响应是正确的,但是您是否能够使用上述代码记录请求正文?如果您实际将主体绑定到动作方法参数,那么参数绑定将实际读取并清空请求主体流。因此,我认为您将请求主体记录在任务延续中的想法行不通

在消息处理程序中记录有关绑定的数据非常复杂,并且在很大程度上取决于您的操作方法。消息处理程序请求处理在模型绑定之前运行,当响应处理部分运行时,模型的概念不存在,因为序列化已经完成。顺便说一句,当您使用JSON负载时,请查看我的博客文章,以检测请求中的额外字段

您可以编写一个操作过滤器来查看模型中的额外字段,如那篇文章中所述,并将该信息存储在请求字典(
request.Properties
)中,稍后在消息处理程序中提取该信息并写入数据库。但这并不是直截了当的

或者,查看内置跟踪程序,看看它是否有用

http://es.com/api/claims/GetGraph?Member_ID=123&DateDiff=5&NotExists=2