2011-12-01 92 views
2

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

例如,我们有以下方法:

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

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

感谢

+0

看看这里:http://stackoverflow.com/questions/280413/c-sharp-how-do-you-find-the-caller-function – Samich

+0

你如何访问该堆栈跟踪输出它? –

+0

我正在使用此代码来获取最近的方法调用。 StackTrace stackTrace = new StackTrace(); _callingFunction = stackTrace.GetFrame(0).GetMethod()。Name; – CSharpened

回答

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旗舰版2010,您还可以使用IntelliTrace

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

更新

看来,System.Runtime.Reflection.GetCurrentMethod可以提供你正在寻找的信息。

+0

感谢您的回应。这不是我正在尝试诊断问题,我只是试图输出调用该方法的名称来生成该函数的输出。 – CSharpened

+0

@CSharpened:用可能的解决方案更新了答案。 –

0

这听起来像您的日志记录机制基于堆栈跟踪记录您当前的方法。堆栈跟踪会在完成当前方法的执行后告诉您代码的下一个位置,而不是您迄今为止调用的方法。另外,这可能并不完全准确,因为JIT可能会内联事物或可能发生其他优化。

WCF有tracing options内置,但这可能是你要求的矫枉过正。否则,您将需要自己明确指定方法名称。这实际上取决于你的日志机制如何工作以达到最佳实施。至少,你可以跟踪一个字符串,或者在服务调用周围设置一个包装器,为你追踪名称。

Trace.WriteLine("ServiceMethodCall");