如何跟踪每个请求ASP.. NET Web API与NLog

本文关键字:NET ASP Web API NLog 请求 何跟踪 跟踪 | 更新日期: 2023-09-27 18:03:15

我用ASP创建了一个简单的REST API。. NET Web API。为了测试的目的,我想添加一些跟踪。所以我把NLog添加到我的项目中。此时我的日志是这样的:

// POST api/values
public void Post([FromBody]string value)
{
    logger.Trace("Request: {0} api/values", Request.Method); 
    _repository.insert(value);
    logger.Trace("Response: {0} api/values", Request.Method); 
}

在每个方法中我都添加了一个记录器。Trace在方法的顶部和底部。我对这个方法有两个问题:

  1. 我需要记住将这些行添加到我的每个方法
  2. 我不知道如何添加JSON正文到我的跟踪

第1点现在不是一个真正的问题(见下文),但我很快需要一些东西来检查我的API收到的每个JSON体。

我已经试过了

// POST api/values
public void Post([FromBody]string value)
{
    logger.Trace("Request: {0} api/values {1}", Request.Method, Request.Body); 
    _repository.insert(value);
    logger.Trace("Response: {0} api/values", Request.Method); 
}

但是Request中没有Body属性

我还为我的观点1找到了一个有趣的文档:http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi

如何跟踪每个请求ASP.. NET Web API与NLog

这就是动作过滤器的作用。在一个动作方法之前/之后做一些事情是一个正在执行的/执行的

public class MyCustomFilter : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        //Do something here before an action method starts executing
    }
    public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext context)
    {
        //Do something here after an action method finished executing
    }
}

然后,你需要在asp.net管道中插入这个过滤器…当应用程序启动时,是否使用owin/katana或global。a:没关系……

GlobalConfiguration.Configuration.Filters.Add(new MyCustomFilter());

上面这行代码将把过滤器添加到所有动作方法中。如果你想关闭某些动作方法的跟踪,只需在动作过滤器中添加一个flag/switch属性,这样你就可以关闭某些动作的跟踪…

public class MyCustomFilter : System.Web.Http.Filters.ActionFilterAttribute
{
    public bool DisableTracing{get;set;}
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if(!DisableTracing){
               //Do something here before an action method starts executing
        }
    }
    public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext context)
    {
        if(!DisableTracing){
               //Do something here before an action method starts executing
        }
    }
}

现在你可以打开它的控制器动作…

[MyCustomFilter(DisableTracing = true)]
public IHttpActionResult MyAction(int id){}

更新

要从请求体中读取JSON对象,只需读取请求的内容,如下所示…

 request.Content.ReadAsStringAsync().Result;

对于MVC, Leo的解决方案似乎是正确的,但对于Http REST API,我不得不从http://www.c-sharpcorner.com/UploadFile/1492b1/restful-day-sharp6-request-logging-and-exception-handingloggin/

实现解决方案。
public class HttpLoggingFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext)
    {
        //Do something here
    }
    public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
    {
        //Do something here
    }
}
在我的代码上测试了这两种方法后,我可以告诉Leo的代码是在页面刷新位上执行的,而不是在简单的REST请求上执行的。