需要将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:
-
ActionFilterAttribute
:可以编写自定义的ActionFilterAttribute
并装饰控制器/操作方法来启用日志logging。答:你需要装饰每一个控制器/方法(你仍然可以在基本控制器上做,但是它不能解决交叉的问题。
-
覆盖
BaseController
并处理日志logging。Con:我们期待/迫使控制器从一个自定义的基础控制器inheritance。
-
使用
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); }