2011-12-01 89 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");