什么是静态字典的生存期? LifestyleTransient | C#|世界足球联合会

时间:2019-06-07 12:05:01

标签: c# wcf static castle-windsor concurrentdictionary

我将一些信息存储在静态字典中,该字典在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()

请为我提供最佳解决方案

预先感谢

1 个答案:

答案 0 :(得分:0)

最后我得到了上述问题的解决方案

由于我在ConcurrentDictionary项目中使用了静态WCF,并且还为每个进程实现了Web花园和静态变量,因此它有时在使用Web Gardern的另一个进程中不起作用

解决方案现在已经停止运行,它可以正常工作,并且将来将通过网络花园实现分布式缓存,例如(Radis,NCache等)

感谢@mjwills和@ Shantanu的宝贵意见