【问题标题】:MemoryCache is not keeping the cache between different services for the same IIS site (WebApi 2)MemoryCache 不会在同一 IIS 站点的不同服务之间保留缓存(WebApi 2)
【发布时间】:2015-06-18 12:36:19
【问题描述】:

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

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

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

我的问题:最后一个请求使用了“导航”服务,此时无法访问缓存(或者缓存不再可用),抛出了我实现的异常。

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 可能容易出错。我建议为属性和字段使用另一个名称。
  • 嗨,Joze,我按照您的建议做了,正如您在我编辑的代码中看到的那样。但是,我仍然遇到同样的问题......
  • 不不,你没有理解我的意思或者我不清楚。我的意思是变量的名称是“MemoryCache”。但是您应该使用MemoryCache 类,因为它是ObjectCache 的实现。为什么不尝试在公共静态中进行缓存并将其作为字段而不是属性直接访问?
  • 嗨,我按照你的建议做了,但还是一样。来自不是“用户”服务的其他服务的任何请求根本无法访问内存缓存..
  • 你能更新你的代码吗?

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


【解决方案1】:

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

作为一种解决方案,我必须保证当用户登录我的应用程序时,所有服务都必须在自己的应用程序的内存中设置缓存。由于“用户”服务已经为登录请求设置了缓存,我为每个“导航”和“评估”服务创建了一个简单的请求,以在他们的服务应用程序中设置缓存。这样,在用户登录的时候调用这三个请求一次,所有的服务都会把token缓存在内存中。

【讨论】:

    【解决方案2】:

    尝试使用 Redis 服务器,它不依赖于应用程序。应该可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 2010-11-29
      • 2013-07-15
      • 2012-07-23
      • 1970-01-01
      • 2014-07-16
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多