MemoryCache不在同一IIS站点的不同服务之间保留缓存(WebApi 2)

时间:2015-06-18 12:36:20

标签: c# caching asp.net-web-api2 memorycache

我使用MemoryCache的目的是阻止同一个用户在我的应用程序中多次登录。

我在同一个IIS站点注册了3项服务:用户,导航和评估服务。我在我的框架中实现了MemoryCache,它用作所有服务之间的参考。我有一个过滤器,用于验证我是否已为任何服务发出的每个请求缓存用户令牌。

当我登录我的应用程序时,它将发送3个请求:2个用于'用户'服务,1个用于'导航'服务。第一个请求将使用“用户”服务设置缓存。这时,我将我的对象缓存在内存中。第二个请求再次使用“用户”服务,该服务验证令牌是否存在并成功返回结果。

我的问题:最后一个请求使用'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);
}

2 个答案:

答案 0 :(得分:0)

我意识到MemoryCache在IIS站点的应用程序级别设置了缓存。即使我拥有相同的站点来托管我的服务,每个服务都有自己的应用程序,正如您在我编辑的帖子中看到的那样。因此,当&#39;用户&#39; service为登录请求设置缓存,它将缓存设置在&#39; user&#39;的内存中。服务申请。因此,当来自“导航”的请求时,服务已发送,无法访问用户&#39;服务申请。

作为一种解决方案,我必须保证当用户登录我的应用程序时,所有服务必须将缓存设置在自己应用程序的内存中。由于&#39;用户&#39;服务已经为登录请求设置了缓存,我为每个导航创建了一个简单的请求&#39;和评估&#39;用于在其服务应用程序中设置缓存的服务。这样,当用户登录时,只调用一次这三个请求,所有服务都会将令牌缓存在内存中。

答案 1 :(得分:0)

尝试使用Redis服务器,它不是应用程序依赖。应该解决你的问题。