WebAPI - 在MessageHandler上记录绑定信息?

时间:2014-11-26 10:18:39

标签: c# asp.net-web-api

我需要记录(而非跟踪)来自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之后阅读responseSendAsync (在续集中)因为我想要单个写入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

这个阶段:

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

http://lbadri.wordpress.com/2014/01/28/detecting-extra-fields-in-asp-net-web-api-request/

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

或者,查看内置跟踪器以查看它是否有用。