我们最近将网站转换为网络应用程序。部署时,一切都很完美。如果我们允许应用程序关闭(即没有人使用它1小时),那么当我们返回它时,Login页面加载正常,但随后对Web Services(旧SOAP服务)的调用失败。这不会在开发环境中重现,只能在我们的服务器上进行。
在我们跟踪某些问题的情况下,似乎一个或多个字符串在使用之前未初始化,导致空字符串或空字符串将其搞砸。
让我们感到非常痛苦的一件事是 Log4Net日志记录完全停止;因此,追踪问题需要大量的克服代码。
任何根本原因的想法(并希望修复)
====== UPDATE ======
其中一个问题追溯到一个有趣的情况......
失败的服务调用产生“它必须至少指定客户端属性”。这是由
设定的profile.Client = ApplicationName;
public static string ApplicationName
{
get
{
return string.Format(CLIENTNAME, Resources.AppVersion.Version);
}
}
哪个电话:
internal static string Version
{
get
{
return ResourceManager.GetString("Version", resourceCulture);
}
}
从概念上讲,如果它能够工作一次就永远不会失败。
另一个问题是当Web应用程序重新加载时Log4net无法正常工作,我们也遇到了静态
private static readonly ILog ExceptionLog = LogManager.GetLogger("ExceptionLogger");
private static readonly ILog SoaLog = LogManager.GetLogger("soaPerfLogger");
private static readonly ILog InfoLog = LogManager.GetLogger("InfoLogger");
private static readonly ILog DebugLog = LogManager.GetLogger("DebugLogger");
明显的原因似乎是在重新启动Web应用程序时归零的静态变量。它们没有被重新初始化。
等待精彩的建议!否则,我将通过代码中的所有852静态用法进行阻塞,以添加代码来解决这种不寻常的行为。
答案 0 :(得分:1)
您的静态字段之间是否存在任何依赖关系,例如期望他们按照一定的顺序进行初始化?如果您的类没有静态构造函数,则无法保证它们的初始化顺序。我总是确保在使用静态字段时包含静态构造函数,并且通常在那里进行初始化而不是使用字段初始化器。请参阅the C# language specification on static field initialization。
我也可以查看granadaCoder的建议,如果不会太痛苦,可以将它们作为Singleton的实例字段。
此应用程序运行的是哪个版本的IIS?
答案 1 :(得分:0)
肯
我被asp.net中的静态成员严重咬了,因为它们在多个asp.net线程中共享。 (静态方法很好。)我不知道这是否可能与您的问题有关,但您可以将这些实例作为基础吗?如果他们的初始化很昂贵,请考虑将它们作为Application
变量存储在App Start中,或者可能存储在Cache
中。
在启动时是否可能有多个请求命中您的应用程序?如果你的初始化是长时间运行的,那么线程/请求第一个开始填充值,而线程/请求#2出现并重新初始化值为null?
那就是说,我不是线程专家,但可以告诉你一个关于我多年前参与过的代码审查/故障排除练习的精彩故事,结果证明是这个问题。客户端有数千个请求在短时间内发生,有些请求覆盖了其他请求填充的static
数据(并且学生正在注册错误的课程。)他们一直在追逐这个问题几个星期并经过某人生活别的噩梦,我在网络应用程序中避免使用静态成员。