是否有一个c#类来跟踪服务方法调用,比如堆栈跟踪

本文关键字:跟踪 调用 堆栈 方法 服务 有一个 是否 | 更新日期: 2023-09-27 18:16:16

我知道当然有一个堆栈跟踪来跟踪对程序中方法的调用,但是它没有显示对服务中方法的调用作为跟踪的一部分。.NET中是否有任何内置功能来识别何时对WCF服务进行调用,然后存储被调用方法的名称?

例如我们有下面的方法:

private void DoStuff()
{
    object  =  Service.ServiceMethodCall();
}

在我看到的堆栈跟踪中,我可以恢复DoStuff()的名称和其他细节,但不能恢复ServiceMethodCall()。我不想简单地将这个方法的名称硬编码到输出中。一定有更好的办法。

谢谢

是否有一个c#类来跟踪服务方法调用,比如堆栈跟踪

如果您试图诊断WCF中的问题,您可以使用内置的WCF跟踪功能,我们发现这是不可或缺的。为此(假设WCF托管在IIS中),在web.config中添加以下内容:

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData="c:'log'WebTrace.svclog"  />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

如果你正在调试并且有VS Ultimate 2010,你也可以使用IntelliTrace。

最后,如果您只是试图跟踪发生的异常的来源,那么在异常中转储StackTrace将显示错误的来源,假设WCF服务调用是链中包含异常处理程序的唯一方法。我们的开发实践要求,除非有特殊的、文档化的情况,否则只有最外层的调用(例如WCF服务条目)将包含异常处理程序。这大大减少了诊断和修复错误所需的时间。

似乎System.Runtime.Reflection.GetCurrentMethod可以提供您正在寻找的信息

听起来您的日志机制是基于堆栈跟踪记录当前方法的。堆栈跟踪告诉您代码执行完当前方法后的下一个目标,而不是到目前为止执行了哪些方法调用。此外,这可能不完全准确,因为JIT可能会内联一些东西或进行额外的优化。

WCF有内置的跟踪选项,但对于您所要求的,这可能是多余的。否则,您将需要自己显式指定方法名称。这实际上取决于您的日志机制如何实现最佳实现。至少,您可以使用字符串进行跟踪,或者在服务调用周围设置一个包装器,为您跟踪名称。

Trace.WriteLine("ServiceMethodCall");