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

我正在使用IIS上托pipe的Microsoft Asp.net WebApi2。 我非常简单地希望logging每个post的请求正文(xml或json)和响应正文。

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

我只是想知道在哪里把我的日志logging代码,以及如何从传入和传出的请求和响应得到实际的JSON或XML。

我的控制器发布方法:

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

我会build议使用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; } } 

只需用你的日志代码replaceTrace.WriteLine ,并像下面这样在WebApiConfig注册处理程序:

 config.MessageHandlers.Add(new LogRequestAndResponseHandler()); 

你有一个select是使用创build一个动作filter和装饰你的WebApiController / ApiMethod。

过滤属性

 public class MyFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.Request.Method == HttpMethod.Post) { var postData = actionContext.ActionArguments; //do logging here } } } 

WebApi控制器

 [MyFilter] public class ValuesController : ApiController{..} 

要么

 [MyFilter] public void Post([FromBody]string value){..} 

希望这可以帮助。

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

  1. ActionFilterAttribute :可以编写自定义的ActionFilterAttribute并装饰控制器/操作方法来启用日志logging。

    答:你需要装饰每一个控制器/方法(你仍然可以在基本控制器上做,但是它不能解决交叉的问题。

  2. 覆盖BaseController并处理日志logging。

    Con:我们期待/迫使控制器从一个自定义的基础控制器inheritance。

  3. 使用DelegatingHandler

    优点:我们没有用这种方法触摸控制器/方法。 委托处理程序隔离并正常处理请求/响应日志logging。

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

访问请求消息很容易。 您的基类ApiController包含.Request属性 ,正如其名称所示,它以parsing的forms包含请求。 无论您想要login什么,您都可以简单地检查它,然后将其传递到您的日志logging工具,无论哪一个。 这个代码可以放在你的行动的开始,如果你只需要做一个或几个。

如果你需要在所有操作上进行操作(所有操作的意义都不止一个),那么你可以重写.ExecuteAsync方法来捕获你的控制器的每个动作调用。

 public override Task<HttpResponseMessage> ExecuteAsync( HttpControllerContext controllerContext, CancellationToken cancellationToken ) { // Do logging here using controllerContext.Request return base.ExecuteAsync(controllerContext, cancellationToken); }