我在Windows 2008 R2 Enterprise 6位服务器上的IIS 7.5中托管了WCF 4.0服务。 WCF服务配置为使用ASP兼容性]。
在Production和QA环境中,我们有一个负载均衡的Web场。在开发中,我们只有一台服务器。我们使用AppFabric缓存作为我们的分布式缓存技术。
AppFabric缓存Windows服务每隔几周崩溃(无论是在Web场还是单一服务器拓扑中)。这与IIS AppPool停止一起发生;以及WCF Web应用程序。除了指示应用程序池已停止的Windows事件日志条目之外,没有其他可以识别的信息可以为我提供有关崩溃原因的任何线索。 WCF应用程序或AppPool的日志文件中没有任何内容。此外,我在WCF应用程序中的日志记录中没有显示任何内容 - 可能是因为在WCF代码运行之前IIS中的请求失败。
当系统未使用时,问题似乎在一夜之间发生 - 第一天请求失败。缓存设置为在新的一天工作开始前1小时到期。我没有服务器的可见性,以确定是否有任何隔夜服务器补丁/更新可能与问题有关(或者由于AppPool回收,缓存只是停止)。
我不是百分百肯定;但要预先知道缓存服务首先停止;然后下一个WCF请求导致AppPool崩溃。
我使用Unity框架(v5.0)进行依赖注入。以下是配置统一容器的代码:
public void Configure(IUnityContainer container)
{
container.RegisterType<ICacheExpireCalculator, CacheExpireCalculatorCMF>("CMF_Cache_ExpiryCalculator", new InjectionMember[] { new InjectionConstructor(new object[] { ConfigurationManager.AppSettings["expireCacheDailyTimeUTC_HHmm"] }) });
if (bool.Parse(ConfigurationManager.AppSettings["useAppFabricCache"]))
{
container.RegisterType<ICache, CacheAppFabricCMF>(new ContainerControlledLifetimeManager(), new InjectionMember[0]);
}
else
{
container.RegisterType<ICache, CacheEntlibCMF>(new ContainerControlledLifetimeManager(), new InjectionMember[0]);
}
container.RegisterType<IJBADataAccess, JBADataAccess>("JbaDataDataAccess", new InjectionMember[] { new InjectionConstructor(new object[] { "jbaConnection" }) });
container.RegisterType<ISqlDataAccess, SqlDataAccess>("SQLDataDataAccess", new InjectionMember[0]);
container.RegisterType<IErrorProvider, CustomErrorProvider>(new ContainerControlledLifetimeManager(), new InjectionMember[0]);
container.RegisterType<IBusinessCMF, BusinessCMF>(new InjectionMember[0]);
container.RegisterType<IDataLookupLoader, DataLookupLoader>(new InjectionMember[0]);
container.RegisterType<IQueryHelper, QueryHelper>(new InjectionMember[0]);
}
当我开始开发解决方案时,我使用Microsoft企业库缓存服务作为临时缓存机制。在WCF配置文件中,我仍然有企业库缓存配置部分 - 这样我就可以继续在我的Windows XP开发机器上使用缓存策略(没有AppFabric缓存)。我使用appSettings标志来指示将使用(a)AppFabric缓存或(b)企业库缓存服务中的哪一个。显然,在生产和QA环境中,AppFabric缓存被标记为使用。
我刚刚从web.config文件中删除了企业库设置;但是在我理解这是否已经消除了一些运行时冲突之前需要等待几周 - 如果两个缓存系统程序集都已加载。
任何想法都将不胜感激:
答案 0 :(得分:2)
一般来说,当发生崩溃时,监视服务器的IO系统(磁盘队列长度)。具体来说,检查您的备份代理/系统。
我看到AppFabric在试图访问其配置时超时崩溃。能够访问其配置非常敏感。我们在群集中使用AF,如果连接到SQL Server甚至短暂中断,我们就会看到崩溃。
我提到了备份系统,因为它可能是您的备份系统正在创建一个VSS快照,这会使机器“冻结”一下。这可能导致足够的IO延迟,AppFabric对无法查看其配置感到不满。这也可以解释您同时发生的AppPool问题。