我将一些信息存储在静态字典中,该字典在WCF服务组件内部的类中定义,如下所示:
public class UserAuthenticator : IUserAuthentication
{
public static ConcurrentDictionary<UserInfo, ConcurrentDictionary<string, BookingDetails>>BookingDetailsDictionary = new ConcurrentDictionary<UserInfo, ConcurrentDictionary<string, BookingDetails>>(new UserEqualityComparer());
public static ConcurrentDictionary<string, Connector> connectorDictionary = new ConcurrentDictionary<string, Connector>();
public BookingDetails Authenticate(UserInfo userInfo, ServiceDetails serviceDetail, XmlElement requestData)
{
var bookDetails = new BookingDetails();
try
{
ConcurrentDictionary<string, BookingDetails> dicObject = null;
if (bookingDictionary.TryGetValue(userInfo, out dicObject))
{...}
else
{
// call Database and get value from database and fill db value in to static ConcurrentDictionary
}
}
}
}
在这里,我检查静态ConcurrentDictionary键是否在不在字典中的值,然后调用数据库并在字典中填充值。
预期的输出是第一次调用wcf服务,然后在ConcurrentDictionary中调用数据库并填充值,然后在所有WCF服务调用之后从ConcurrentDictionary中读取数据
现在,问题是有时我看到静态的ConcurrentDictionary计数为零。而奇怪的是,应用程序池仍处于活动状态。没有应用程序池仍在回收,它会随机调用数据库,有时会从ConcurrentDictionary获取数据
这对我来说真的很奇怪。我假设静态变量将保持其值,直到应用程序结束。但是,即使应用程序池没有回收或IIS也没有重新启动,静态变量也会归零。
您有什么建议?使用ConcurrentDictionary变量是更好的选择吗?
注意:我在wcf应用程序中使用了城堡温莎依赖注入,并且UserAuthenticator
类已向LifestyleTransient()
注册,如下所示
Component.For<IUserAuthentication, UserAuthenticator>().LifestyleTransient()
请为我提供最佳解决方案
预先感谢
答案 0 :(得分:0)
最后我得到了上述问题的解决方案
由于我在ConcurrentDictionary
项目中使用了静态WCF
,并且还为每个进程实现了Web花园和静态变量,因此它有时在使用Web Gardern的另一个进程中不起作用
解决方案现在已经停止运行,它可以正常工作,并且将来将通过网络花园实现分布式缓存,例如(Radis,NCache等)
感谢@mjwills和@ Shantanu的宝贵意见