我們繼承了我們想要改進的設計稍差的WCF服務。其中一個問題是它有超過一百種方法(在兩個不同的接口上),其中大多數我們懷疑沒有使用。我們決定在每種方法上進行一些日誌記錄,以跟蹤何時以及如何調用它們。爲了使跟蹤代碼重構友好和錯字證明,我們實現了它,像這樣:然後爲什麼Type.GetInterfaces()有時不會返回有效的列表?
public void LogUsage()
{
try
{
MethodBase callingMethod = new StackTrace().GetFrame(1).GetMethod();
string interfaceName = callingMethod.DeclaringType.GetInterfaces()[0].Name;
_loggingDao.LogUsage(interfaceName, callingMethod.Name, GetClientAddress(), GetCallingUrl());
}
catch (Exception exception)
{
_legacyLogger.Error("Error in usage tracking", exception);
}
}
LogUsage()
被稱爲在我們要跟蹤每個方法的開始。
該服務是非常高的流量,每天的通話量爲500,000+次。 99.95%的時間,這段代碼執行得很漂亮。但其他0.05%的時間,GetInterfaces()
返回一個空的(但不是null
)數組。
爲什麼GetInterfaces()
偶爾會返回不一致的結果?
這看起來很瑣碎 - 我們通常只會夢到0.05%的錯誤率。但是,重點是確定全部服務接觸點,如果這個錯誤總是來自一個(或幾個)方法調用,那麼我們的跟蹤是不完整的。我試圖通過調用服務上的每個方法來在我的開發環境中重現此錯誤,但無濟於事。
不完整的堆棧跟蹤? –
如果你還記錄'callingMethod',你可能會發現它的聲明類型實際上沒有接口。 –
'LogUsage'只能從兩個類中的方法調用,並且這兩個類至少實現一個接口。 – nateirvin