0

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

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

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

关于根本原因的任何想法(并希望得到修复)

========更新=========

其中一个问题可以追溯到一个有趣的情况……</p>

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

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

4

2 回答 2

1

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

如果这不会太痛苦,我也可能会查看 granadaCoder 的建议并将它们设为 Singleton 的实例字段。

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

于 2013-09-25T17:37:04.650 回答
0

肯,

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

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

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

于 2013-09-25T16:32:43.910 回答