是否有一个C#类用于跟踪服务方法调用,如堆栈跟踪

时间:2011-12-01 15:45:49

标签: c# .net wcf stack-trace

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

例如,我们有以下方法:

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

在我看到的堆栈跟踪中,我可以恢复DoStuff()的名称和其他详细信息,但不能恢复ServiceMethodCall()。我不想简单地将此方法的名称硬编码到我的输出中。必须有更好的方法。

由于

2 个答案:

答案 0 :(得分:2)

如果您正在尝试诊断WCF中的问题,则可以使用内置的WCF跟踪功能,我们发现这是必不可少的。为此(假设在IIS中托管WCF),将以下内容添加到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似乎可以提供您要查找的信息。

答案 1 :(得分:0)

听起来您的日志记录机制会根据堆栈跟踪记录您当前的方法。堆栈跟踪告诉您完成执行当前方法后代码的下一步,而不是您到目前为止所进行的方法调用。此外,这可能不完全准确,因为JIT可能内联或可能发生其他优化。

WCF已内置tracing options,但这可能对您所要求的内容有些过分。否则,您需要自己明确指定方法名称。这实际上取决于您的日志记录机制如何工作以实现最佳实现。至少,您可以使用字符串进行跟踪,或者在为您追踪名称的服务调用周围设置包装器。

Trace.WriteLine("ServiceMethodCall");