AspNet Web应用程序 - 一些值在唤醒时为空

时间:2013-09-25 13:11:40

标签: c# asp.net web-applications log4net reloading

我们最近将网站转换为网络应用程序。部署时,一切都很完美。如果我们允许应用程序关闭(即没有人使用它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静态用法进行阻塞,以添加代码来解决这种不寻常的行为。

2 个答案:

答案 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数据(并且学生正在注册错误的课程。)他们一直在追逐这个问题几个星期并经过某人生活别的噩梦,我在网络应用程序中避免使用静态成员。