我知道当然有一个堆栈跟踪用于跟踪程序中对方法的调用,但它不会在跟踪中显示对服务中的方法的调用。 .NET中是否有内置功能来识别何时对WCF服务进行调用,然后存储被调用方法的名称?
例如,我们有以下方法:
private void DoStuff()
{
object = Service.ServiceMethodCall();
}
在我看到的堆栈跟踪中,我可以恢复DoStuff()的名称和其他详细信息,但不能恢复ServiceMethodCall()。我不想简单地将此方法的名称硬编码到我的输出中。必须有更好的方法。
由于
答案 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");