需要将asp.net webapi 2请求和响应正文记录到数据库中吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (93)

我正在使用IIS上托管的Microsoft Asp.net WebApi2。我非常希望记录每个帖子的请求正文(xml或json)和响应正文。

这个项目或者处理该帖子的控制者没有什么特别之处。我不感兴趣使用日志框架,如nLog,elmah,log4net或webapi的内置跟踪功能,除非有必要这样做。

我只是想知道在哪里放置我的日志代码,以及如何从传入和传出的请求和响应中获取实际的json或xml。

我的控制器发布方法:

public HttpResponseMessage Post([FromBody])Employee employee)
{
   if (ModelState.IsValid)
   {
      // insert employee into to database
   }

}
提问于
用户回答回答于

我会推荐使用一个DelegatingHandler。那么你不需要担心控制器中的任何日志代码。

public class LogRequestAndResponseHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // log request body
        string requestBody = await request.Content.ReadAsStringAsync();
        Trace.WriteLine(requestBody);

        // let other handlers process the request
        var result = await base.SendAsync(request, cancellationToken);

        if (result.Content != null)
        {
            // once response body is ready, log it
            var responseBody = await result.Content.ReadAsStringAsync();
            Trace.WriteLine(responseBody);
        }

        return result;
    }
}

只需替换Trace.WriteLine日志代码,并WebApiConfig像这样注册处理程序:

config.MessageHandlers.Add(new LogRequestAndResponseHandler());
用户回答回答于

对于每个WebAPI方法调用,通常有多种方法来处理请求/响应日志记录:

  1. ActionFilterAttribute:可以编写自定义ActionFilterAttribute并装饰控制器/操作方法以启用日志记录。 Con:你需要装饰每一个控制器/方法(你仍然可以在基础控制器上做到这一点,但它仍然没有解决横切问题。
  2. 覆盖BaseController并处理日志记录。 Con:我们期待/迫使控制器从一个定制的基础控制器继承。
  3. 使用DelegatingHandler。 优点:我们在这里没有用这种方法触摸控制器/方法。委托处理程序隔离并正常处理请求/响应日志记录。

有关更深入的文章,请参阅http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi

所属标签

可能回答问题的人

  • 嗨喽你好

    7 粉丝480 提问8 回答
  • uncle_light

    5 粉丝518 提问7 回答
  • 富有想象力的人

    3 粉丝0 提问6 回答
  • 人生的旅途

    10 粉丝484 提问6 回答

扫码关注云+社区

领取腾讯云代金券