2013-09-25 23 views
0

最近我们转换一个网站,Web应用程序。我们部署时一切正常。如果我们允许应用程序关闭(即没有人使用它1小时),那么当我们回到它时,Login页面加载正常,但是然后调用Web服务(旧的SOAP服务)失败。这不会在开发环境中重现,只能在我们的服务器上重现。ASPNET Web应用程序 - 有些值是零上唤醒

在我们追踪了一些问题的情况下,似乎一个或多个字符串在使用前未被初始化,导致空字符串或空字符串吹起来。

真正让我们痛心的一件事是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); 
    } 
} 

从概念上讲,如果它的工作,一旦它应该永远不会失败。

的另一个问题是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静态用法猛击,以添加代码来解决这种不寻常的行为。

+0

想法(?):用Singleton模式封装ILog。 – granadaCoder

+0

你如何关闭你的web应用程序iisreset/stop? 你重置/回收应用程序池? – Anand

回答

0

肯,

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

有可能比一个请求打你上启动应用程序吗?如果你的初始化是长时间运行的,当线程/请求#2出现时线程/请求第一个人开始填充值,并将值重新初始化为空?

这就是说,我不是线程专家,但可以告诉你一个代码审查/故障排除练习,我以前参加年来的竟然是这个确切的问题,一个伟大的故事。客户有数以千计的请求发生在短期内,有些人正在覆盖其他请求填充的数据(并且学生正在注册错误的类。)他们一直在追逐这个问题好几个星期,在经历别人的噩梦之后,我避免了在web应用程序中使用静态成员。

+0

PS:无论我的回复有什么价值,我们都应该吃午饭。 – andleer

1

您的静态字段之间是否存在任何依赖关系,例如:期待他们按照特定顺序初始化?如果您的类没有静态构造函数,则不能保证它们将被初始化的顺序。我总是确保在使用静态字段时包含静态构造函数,并且通常在那里进行初始化,而不是使用字段初始化器。见the C# language specification on static field initialization

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

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