【问题标题】:Is there a C# class for tracking service method calls like a stack trace是否有用于跟踪服务方法调用的 C# 类,如堆栈跟踪
【发布时间】:2012-01-10 18:15:54
【问题描述】:

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

例如我们有下面的方法:

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

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

谢谢

【问题讨论】:

  • 你如何访问这个堆栈跟踪来输出它?
  • 我正在使用此代码获取最新的方法调用。 StackTrace stackTrace = new StackTrace(); _callingFunction = stackTrace.GetFrame(0).GetMethod().Name;
  • 只有在 ServiceMethod 内部才能看到 ServiceMethodCall。从服务中抛出异常并查看堆栈的样子。另外,请告诉我们您要完成的工作。
  • 拦截器(例如 Unity IInterceptionBehavior)可能是一个选项...

标签: c# .net wcf stack-trace


【解决方案1】:

如果您尝试诊断 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 似乎可以提供您正在寻找的信息。

【讨论】:

  • 感谢您的回复。这不是我试图诊断一个问题,我只是试图输出被调用的方法的名称以产生函数的输出。
  • @CSharpened:用可能的解决方案更新了答案。
【解决方案2】:

听起来您的日志记录机制根据堆栈跟踪记录您当前的方法。堆栈跟踪会告诉您代码在执行完当前方法后下一步要去哪里,而不是您到目前为止已经进行了哪些方法调用。此外,这可能并不完全准确,因为 JIT 可能会内联事物或可能会发生额外的优化。

WCF 内置了tracing options,但这对于您的要求可能有点过头了。否则,您将需要自己显式指定方法名称。这实际上取决于您的日志记录机制如何工作以实现最佳实施。至少,您可以只使用字符串进行跟踪,或者在服务调用周围设置一个包装器来为您跟踪名称。

Trace.WriteLine("ServiceMethodCall");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多