【问题标题】:Capture ALL WebAPI requests捕获所有 WebAPI 请求
【发布时间】:2014-11-18 14:06:07
【问题描述】:

我想捕获我的 WebAPI 应处理的所有请求并将其保存在日志文件中。

刚刚尝试从控制器构造函数中保存 Request.Content 但不幸的是, 请求对象在控制器构造函数范围内为空。

希望学习一种有效的方法来做到这一点。

【问题讨论】:

  • 您可以使用log4netElmah 等工具记录请求和响应
  • 谢谢,我正在寻找不使用外部工具的本地解决方案。

标签: asp.net asp.net-mvc-4 asp.net-web-api


【解决方案1】:

我只想加入 web api 跟踪...

http://www.asp.net/web-api/overview/testing-and-debugging/tracing-in-aspnet-web-api

从上面的文章中,您可以像这样实现 ITraceWriter。此示例使用 System.Diagnostics.Trace.WriteLine,但您也可以在此处插入写入文件。

public class SimpleTracer : ITraceWriter
{
    public void Trace(HttpRequestMessage request, string category, TraceLevel level, 
        Action<TraceRecord> traceAction)
    {
        TraceRecord rec = new TraceRecord(request, category, level);
        traceAction(rec);
        WriteTrace(rec);
    }

    protected void WriteTrace(TraceRecord rec)
    {
        var message = string.Format("{0};{1};{2}", 
            rec.Operator, rec.Operation, rec.Message);
        System.Diagnostics.Trace.WriteLine(message, rec.Category);
    }
}

从 Trace 方法中可以看出,您可以在此处访问 HttpRequestMessage。

【讨论】:

    【解决方案2】:

    我最终实现了中间件来处理它。

    public class GlobalRequestLogger : OwinMiddleware
    {
       public override Task Invoke(IOwinContext context)
       {
          // Implement logging code here
       }
    }
    

    然后在您的 Startup.cs 中:

    app.Use<GlobalRequestLogger>();
    

    【讨论】:

    • 使用 OWIN 为我指明了正确的方向。您可以解释更多,例如如何创建和配置 Startup 类以及等待 this.Next.Invoke(context);在被覆盖的 Invoke 方法中是必需的。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2017-01-02
    • 2014-08-29
    相关资源
    最近更新 更多