StackTrace和WCF类的奇怪之处

时间:2011-11-01 17:20:18

标签: c# .net wcf stack-trace

我们有一个C#日志类,它使用System.Diagnostics.StackTrace和StackFrame来获取有关调用logger.writeLine()的文件名,亚麻,类和方法的信息,然后将其插入到日志消息中。

我们在控制台应用程序,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的一个奇怪的角落。当我遇到像这样的怪语,并找到似乎处理它们的解决方法时,有一半时间还有一些其他问题我还没有注意到。

那么,有没有人对为什么会发生这种情况有任何解释?

1 个答案:

答案 0 :(得分:3)

在IIS下运行时,您无权检查自己的程序集外部(堆栈上方)的代码。

无论如何,通过查看st.FrameCount,您可以轻松地使代码成为条件。