首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >需要将asp.net webapi 2请求和响应正文记录到数据库中

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

Stack Overflow用户
提问于 2014-05-15 00:33:23
回答 4查看 82.4K关注 0票数 111

我正在使用托管在IIS上的Microsoft Asp.net WebApi2。我只想记录每个帖子的请求正文(XML或JSON)和响应正文。

这个项目和处理post的控制器没有什么特别之处。除非有必要,否则我对使用nLog、elmah、log4net等日志记录框架或web的内置跟踪功能不感兴趣。

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

我的控制器post方法:

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

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-15 01:01:03

我建议使用DelegatingHandler。然后,您将不需要担心控制器中的任何日志记录代码。

public class LogRequestAndResponseHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.Content != null)
        {
            // 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());

这是完整的微软Message Handlers文档。

票数 208
EN

Stack Overflow用户

发布于 2014-05-15 02:28:06

你可以选择创建一个动作过滤器,并用它来装饰你的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控制器

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

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

希望这能有所帮助。

票数 14
EN

Stack Overflow用户

发布于 2014-05-15 01:01:23

访问请求消息很容易。您的base class, ApiController包含.Request property,顾名思义,它包含解析形式的请求。您只需检查要记录的内容,并将其传递给您的日志记录工具。如果你只需要为一个或几个人做这件事,你可以把这段代码放在你动作的开始。

如果您需要在所有操作上执行此操作(所有操作都意味着不只是几个可管理的操作),那么您可以做的就是覆盖.ExecuteAsync方法来捕获控制器的每个操作调用。

public override Task<HttpResponseMessage> ExecuteAsync(
    HttpControllerContext controllerContext,
    CancellationToken cancellationToken
)
{
    // Do logging here using controllerContext.Request
    return base.ExecuteAsync(controllerContext, cancellationToken);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23660340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档