gpt4 book ai didi

c# - StackTrace 和 WCF 类的奇怪之处

转载 作者:行者123 更新时间:2023-11-30 16:27:24 25 4
gpt4 key购买 nike

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

我们已经在控制台应用程序、Windows 服务、.aspx 网络应用程序和 .asmx 网络服务中使用了它,没有出现任何问题。

我现在正在处理 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 中,我也只在构造函数中遇到问题。在 OperationContract 方法和从它们调用的方法中,对 logger.writeLine() 的调用工作得很好。只有在构造函数中,并且只有在由 IIS 托管时,才会出现问题。

如果我在 logger.writeLine() 中对此进行 try/catch 包装,这样如果发生异常,我们就不会在日志文件中包含行信息,一切正常。或者我不能在构造函数中使用日志记录——我在构造函数中所做的唯一一件事就是记录构造函数已被调用。所以我实际上没有问题。

但我想知道发生了什么,以及我无意中遇到了 .NET 的哪个奇怪角落。当我遇到像这样的怪事,并找到似乎可以解决这些问题的变通办法时,有一半的时间是我还没有注意到一些其他问题。

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

最佳答案

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

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

关于c# - StackTrace 和 WCF 类的奇怪之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com