单例对象和AppPool回收

时间:2015-03-11 18:28:32

标签: caching iis asp.net-web-api2 application-singleton

我目前正在构建针对kerberos域控制器对用户进行身份验证的休息服务。由于每次用户尝试在系统中执行操作时都会调用KDC非常耗时,因此我有一个缓存,其中存储了一个带有相关主体的身份验证令牌。

基本上,我的服务提供了两种身份验证方案:Kerberos和令牌。我遇到的问题是当应用程序池被回收时,我的缓存对象(在我的DI容器中作为单一格式)将丢失。此外,即使应用程序池未被回收,此行为也会阻止我通过多个服务器分发我的服务。

如何在应用程序池中保留缓存对象?

1 个答案:

答案 0 :(得分:0)

通过回收应用程序池,您实际上是终止应用程序并从头开始。与任何标准应用程序一样,有几种方法可以跨应用程序的实例保存数据:

1)在KDC上添加身份验证层。在可以从主服务调用的其他应用程序池中创建另一个服务。如果新的应用程序池被回收,您仍然会遇到相同的问题,但要回收的条件应该特定于用户的身份验证和服务器的状态。

2)将对象保留在您自己或文件系统的数据库中。如果在身份验证后序列化对象,则可以在本地存储中保留对象,该对象可能比访问KDC控制器更便宜。