AspNet Web 应用程序 - 某些值在唤醒时为 Null

本文关键字:唤醒 Null Web 应用程序 AspNet | 更新日期: 2023-09-27 18:32:49

我们最近将一个网站转换为Web应用程序。当我们部署时,一切都会完美运行。如果我们允许应用程序关闭(即 1 小时内没有人使用它(,那么当我们返回它时,登录页面加载正常,但随后对 Web 服务(旧 SOAP 服务(的调用失败。这不会在开发环境中重现,只会在我们的服务器上重现。

在我们追踪一些问题的地方,似乎一个或多个字符串在使用之前没有初始化,导致空字符串或空字符串会破坏事情。

真正让我们痛苦的一件事是 Log4Net 日志记录完全停止;因此跟踪问题需要大量的代码。

对根本原因的任何想法(并希望是修复(

========更新

==

=======

其中一个问题追踪到一个有趣的情况......

失败的服务调用生成"它必须至少指定客户端属性"。这是由这个设定的

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);
    }
}

从概念上讲,如果它工作一次,它就永远不会失败。

另一个问题是 Log4net 在 Web 应用程序重新加载时无法正常工作,我们也遇到了静态

    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 个静态用法,以添加代码来解决这种异常行为。

AspNet Web 应用程序 - 某些值在唤醒时为 Null

静态字段之间是否存在任何依赖关系,例如期望它们按特定顺序初始化? 如果您的类没有静态构造函数,则无法保证它们的初始化顺序。 我总是确保在使用静态字段时包含一个静态构造函数,并且通常在那里进行初始化而不是使用字段初始化器。 请参阅有关静态字段初始化的 C# 语言规范。

我也可以看看 granadaCoder 的建议,并将它们作为单例的实例字段,如果这不会太痛苦的话。

此应用程序在哪个版本的 IIS 上运行?

Ken,

我在 asp.net 中被静态成员严重咬伤,因为它们在多个 asp.net 线程中共享。(静态方法很好。我不知道这是否与您的问题有关,但您可以基于这些实例吗?如果它们的初始化成本很高,请考虑将它们作为Application变量存储在 App Start 或可能存储在 Cache 中。

在启动时是否可能有多个请求命中您的应用程序?如果您的初始化长时间运行,线程/请求编号 1 是否开始填充值,而线程/请求 #2 出现并将值重新初始化为 null?

也就是说,我

不是线程专家,但可以告诉你一个关于我几年前参加的代码审查/故障排除练习的精彩故事,结果证明正是这个问题。客户端在短时间内发生了数千个请求,其中一些请求覆盖了其他请求填充的static数据(并且学生注册了错误的课程(。他们已经追逐这个问题数周了,在经历了别人的噩梦之后,我避免在 Web 应用程序中使用静态成员。