2011-11-01 77 views
3

我們有一個C#日誌記錄類,它使用System.Diagnostics.StackTrace和StackFrame獲取有關文件名,linenumber,類和調用logger.writeLine()的方法的信息,然後插入到日誌消息中。StackTrace和WCF類的奇怪

我們已經在控制檯應用程序,Windows服務,.aspx Web應用程序和.asmx Web服務中使用了它,沒有任何問題。

我現在正在使用IIS託管的WCF服務,而且我看到一些奇怪的東西。

如果我把一個logger.writeLine()在ServiceBehavior類的構造函數,它得到這個代碼:

System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(true); 
System.Diagnostics.StackFrame sf = st.GetFrame(2); 

第一行似乎返回null。或者,至少,第二個拋出一個NullReferenceException。

現在這裏是怪異的。這隻發生在我在IIS中託管web服務時。當我在Visual Studio的開發服務器上運行時,我沒有任何問題。

即使在IIS中,我只在構造函數中遇到問題。調用logger.writeLine()在OperatioonContract方法和從它們調用的方法中工作得很好。它只在構造函數中,並且只有在由IIS託管時纔會出現問題。

如果我在logger.writeLine()中包裝try/catch,這樣如果發生異常,我們只是不在日誌文件中包含行信息,一切正常。或者我可以不在構造函數中使用日誌記錄 - 我在構造函數中做的唯一事情是記錄構造函數已被調用。所以我實際上沒有問題。

但我想知道發生了什麼,以及我偶然發現的.NET奇怪的角落。當我遇到這樣的怪事,並找到似乎處理它們的解決方法時,有一半時間還有一些我還沒有注意到的其他問題。

那麼,有沒有人有任何解釋爲什麼這可能會發生?

+0

_what_?的構造函數?應用程序對象? –

+0

ServiceBehavior類的構造函數。 –

回答

3

在IIS下運行時,您沒有權限檢查代碼以外(上面的堆棧中)您自己的程序集。

無論如何,您可以通過查看st.FrameCount輕鬆地使您的代碼有條件。

+0

ahh剛被henk打敗了,這是正確的答案 –

+0

這聽起來像是一個合理的答案。除此之外,爲什麼st.GetFrame(2)並不總是在我自己的程序集中。 ServiceBehavior構造函數調用Logger.writeLine(),Logger.writeLine()調用Logger.getFileinfo()和Logger.getFileinfo()調用StackTrace()。所以GetFrame(0)應該是Logger.getFileinfo(),GetFrame(1)應該是Logger.writeLine(),而GetFrame(2)應該是ServiceBehavior的構造函數 - 應該總是在我自己的程序集中。 –

+0

我不確定,但我認爲這些是對這些方法的調用,所以Frame(2)是從主機到您的ctor的調用。我認爲適用主持人規則。 –