MemoryCache 不保留同一 IIS 站点的不同服务之间的缓存 (WebApi 2)
MemoryCache is not keeping the cache between different services for the same IIS site (WebApi 2)
我使用 MemoryCache 的目标是防止同一用户在我的应用程序中多次登录。
我在同一个 IIS 站点中注册了 3 个服务:用户、导航和评估服务。我在我的框架中实现了 MemoryCache,用作所有服务之间的参考。我有一个过滤器,用于验证我是否为从任何服务发出的每个请求缓存了用户令牌。
当我登录我的应用程序时,它会发送 3 个请求:2 个用于 'user' 服务,1 个用于 'navigation' 服务。第一个请求将使用 'user' 服务设置缓存。这时,我会将我的对象缓存在内存中。第二个请求再次使用 'user' 服务,验证令牌是否存在并且 return 结果成功。
我的问题:上次请求使用了'navigation'服务,此时无法访问缓存(或者缓存已经不可用),抛出我实现的异常。
IIS 站点
Sites
-> APR
-> API
-> User
-> V1 (application)
-> Navigation
-> V1 (application)
-> Evaluation
-> V1 (application)
下面是我的代码:
public static CacheItemPolicy policy = new CacheItemPolicy();
public static MemoryCache cache = MemoryCache.Default;
public static bool GetCache<T>(string key, out T output, T defaultValue)
{
try
{
output = (T)cache.Get(key);
if (output != null)
{
return true;
}
}
catch { }
output = defaultValue;
return false;
}
public static void SetCache(string key, object obj, DateTime date)
{
try
{
policy.AbsoluteExpiration = date;
cache.Set(key, obj, policy);
}
catch { }
}
public static void RemoveCache(string key)
{
cache.Remove(key);
}
我意识到MemoryCache在IIS站点的应用程序级别设置了缓存。即使我有同一个站点来托管我的服务,每个服务都有自己的应用程序,正如您在我编辑的 post 中看到的那样。因此,当 'user' 服务为登录请求设置缓存时,它会在 'user' 服务应用程序的内存中设置缓存。因此,当发送来自 'navigation' 服务的请求时,它无法访问 'user' 服务应用程序。
作为一个解决方案,我必须保证当用户登录我的应用程序时,所有的服务都必须在它自己的应用程序的内存中设置缓存。由于 'user' 服务已经为登录请求设置了缓存,我为每个 'navigation' 和 'evaluation' 服务创建了一个简单的请求,以在他们的服务应用程序中设置缓存。这样,在用户登录时只调用一次这三个请求,所有服务都会将token缓存在内存中。
尝试使用 Redis 服务器,它不依赖于应用程序。应该可以解决您的问题。
我使用 MemoryCache 的目标是防止同一用户在我的应用程序中多次登录。
我在同一个 IIS 站点中注册了 3 个服务:用户、导航和评估服务。我在我的框架中实现了 MemoryCache,用作所有服务之间的参考。我有一个过滤器,用于验证我是否为从任何服务发出的每个请求缓存了用户令牌。
当我登录我的应用程序时,它会发送 3 个请求:2 个用于 'user' 服务,1 个用于 'navigation' 服务。第一个请求将使用 'user' 服务设置缓存。这时,我会将我的对象缓存在内存中。第二个请求再次使用 'user' 服务,验证令牌是否存在并且 return 结果成功。
我的问题:上次请求使用了'navigation'服务,此时无法访问缓存(或者缓存已经不可用),抛出我实现的异常。
IIS 站点
Sites
-> APR
-> API
-> User
-> V1 (application)
-> Navigation
-> V1 (application)
-> Evaluation
-> V1 (application)
下面是我的代码:
public static CacheItemPolicy policy = new CacheItemPolicy();
public static MemoryCache cache = MemoryCache.Default;
public static bool GetCache<T>(string key, out T output, T defaultValue)
{
try
{
output = (T)cache.Get(key);
if (output != null)
{
return true;
}
}
catch { }
output = defaultValue;
return false;
}
public static void SetCache(string key, object obj, DateTime date)
{
try
{
policy.AbsoluteExpiration = date;
cache.Set(key, obj, policy);
}
catch { }
}
public static void RemoveCache(string key)
{
cache.Remove(key);
}
我意识到MemoryCache在IIS站点的应用程序级别设置了缓存。即使我有同一个站点来托管我的服务,每个服务都有自己的应用程序,正如您在我编辑的 post 中看到的那样。因此,当 'user' 服务为登录请求设置缓存时,它会在 'user' 服务应用程序的内存中设置缓存。因此,当发送来自 'navigation' 服务的请求时,它无法访问 'user' 服务应用程序。
作为一个解决方案,我必须保证当用户登录我的应用程序时,所有的服务都必须在它自己的应用程序的内存中设置缓存。由于 'user' 服务已经为登录请求设置了缓存,我为每个 'navigation' 和 'evaluation' 服务创建了一个简单的请求,以在他们的服务应用程序中设置缓存。这样,在用户登录时只调用一次这三个请求,所有服务都会将token缓存在内存中。
尝试使用 Redis 服务器,它不依赖于应用程序。应该可以解决您的问题。