Azure DataCache实例化

时间:2013-09-05 15:06:09

标签: azure azure-caching

我正在创建一个新的MVC应用程序来从Azure数据缓存中提取数据。但是,只要我尝试实例化DataCache对象,我的代码就会无限期地挂起。我没有得到错误或超时,它只是坐在那里试图创建新对象。

目前我的代码实际上只不过是:

public ActionResult Index()
{
  DataCache cache = new DataCache();
  Debugger.break;
}

但是永远不会超过new DataCache()声明。如果我在visual studio中暂停调试器,我可以看到它在new DataCache()行上暂停,因此这绝对是执行停滞的地方。

当我导入新的azure缓存包时,我的web.config有NuGet添加的部分,如下所示:

<dataCacheClients>
  <dataCacheClient name="default">
    <!--To use the in-role flavor of Windows Azure Caching, set identifier to be the cache cluster role name -->
    <!--To use the Windows Azure Caching Service, set identifier to be the endpoint of the cache cluster -->
    <autoDiscover isEnabled="true" identifier="{{REMOVED}}" />

    <!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />-->

    <!--Use this section to specify security settings for connecting to your cache. This section is not required if your cache is hosted on a role that is a part of your cloud service. -->
    <securityProperties mode="Message" sslEnabled="false">
      <messageSecurity authorizationInfo="{{REMOVED}}" />
    </securityProperties>
  </dataCacheClient>
</dataCacheClients>

我已经仔细检查了web.config中的值与Azure门户中的值匹配,并且它们是oK。

有谁知道这个的原因?考虑到它有多新,我猜它的东西非常基本。

7 个答案:

答案 0 :(得分:1)

我有一个坐在我对面的开发人员在使用IIS Express时无法访问缓存。

当他切换到IIS Proper时,它可以工作。

答案 1 :(得分:0)

您正在使用共享缓存(缓存服务预览) - 其他两个选项是“在角色中”缓存 - 请在Windows Azure Cache阅读更多内容。假设您的所有设置在配置中都是正确的,那么您没有正确地实例化缓存。阅读How to Use Windows Azure Cache Service (Preview)。你需要使用:

DataCache cache = new DataCache("default");

或:

// Cache client configured by settings in application configuration file.
DataCacheFactory cacheFactory = new DataCacheFactory();
DataCache cache = cacheFactory.GetDefaultCache();
// Or DataCache cache = cacheFactory.GetCache("default");
// cache can now be used to add and retrieve items.

最后,创建缓存对象非常昂贵 - 您应该为缓存创建一个新的单例类,以便创建一次 - 而不是每次调用一个操作。以下是单例类的完整示例:

public static class MyCache
{
    private static DataCacheFactory _cacheFactory = null;
    private static ObjectCache Cache
    {
        get
        {
            return MemoryCache.Default;
        }
    }

    private static DataCache ACache
    {
        get
        {
            if (_cacheFactory == null)
            {
                try
                {
                    _retryPolicy.ExecuteAction(() => { _cacheFactory = new DataCacheFactory(); });
                    return _cacheFactory == null ? null : _cacheFactory.GetDefaultCache();
                }
                catch (Exception ex)
                {
                    ErrorSignal.FromCurrentContext().Raise(ex);
                    return null;
                }
            }

            return _cacheFactory.GetDefaultCache();
        }
    }

    public static void FlushCache()
    {
        ACache.Clear();
    }

    // Define your retry strategy: retry 3 times, 1 second apart.
    private static readonly FixedInterval  _retryStrategy = new FixedInterval(3, TimeSpan.FromSeconds(1));

    // Define your retry policy using the retry strategy and the Windows Azure storage
    // transient fault detection strategy.
    private static RetryPolicy _retryPolicy = new RetryPolicy<StorageTransientErrorDetectionStrategy>(_retryStrategy);

    // Private constructor to prevent instantiation
    // and force consumers to use the Instance property
    static MyCache()
    { }

    /// <summary>
    /// Add an item to the cache with a key and set a absolute expiration on it
    /// </summary>
    public static void Add(string key, object value, int minutes = 90)
    {
        try
        {
            if (RoleEnvironment.IsAvailable)
            {
                _retryPolicy.ExecuteAction(() => { ACache.Put(key, value, TimeSpan.FromMinutes(minutes)); });
            }
            else
            {
                Cache.Add(key, value, new CacheItemPolicy { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(minutes) });
            }
        }
        catch (Exception ex)
        {
            ErrorSignal.FromCurrentContext().Raise(ex);
        }
    }

    /// <summary>
    /// Add the object with the specified key to the cache if it does not exist, or replace the object if it does exist and set a absolute expiration on it
    /// only valid for Azure caching
    /// </summary>
    public static void Put(string key, object value, int minutes = 90)
    {
        try
        {  
            if (RoleEnvironment.IsAvailable)
            {
                _retryPolicy.ExecuteAction(() => { ACache.Put(key, value, TimeSpan.FromMinutes(minutes)); });
            }
            else
            {
                Cache.Add(key, value, new CacheItemPolicy { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(minutes) });
            }
        }
        catch (Exception ex)
        {
            ErrorSignal.FromCurrentContext().Raise(ex);
        }
    }

    /// <summary>
    /// Get a strongly typed item out of cache
    /// </summary>
    public static T Get<T>(string key) where T : class
    {
        try
        {
            object value = null;

            if (RoleEnvironment.IsAvailable)
            {
                _retryPolicy.ExecuteAction(() => { value = ACache.Get(key); });
            }
            else
            {
                value = Cache[key];
            }

            if (value != null) return (T) value;
            return null;
        }
        catch (DataCacheException ex)
        {
            ErrorSignal.FromCurrentContext().Raise(ex);
            return null;
        }
        catch (Exception ex)
        {
            ErrorSignal.FromCurrentContext().Raise(ex);
            return null;
        }
    }
    /// <summary>
    /// Microsoft's suggested method for cleaning up resources such as this in a static class
    /// to ensure connections and other consumed resources are returned to the resource pool
    /// as quickly as possible.
    /// </summary>
    public static void Uninitialize()
    {
        if (_cacheFactory == null) return;
        _cacheFactory.Dispose();
        _cacheFactory = null;
    }
}

答案 2 :(得分:0)

您肯定添加了正确的NuGet包。您使用的是缓存服务(预览)的基本产品,而不是已弃用的共享缓存。

在标识符字段中,您是否指定了完整的端点名称 - [yourcachename] .cache.windows.net?

答案 3 :(得分:0)

根据我自己的经验,这是我的猜测。我打赌你正在使用缓存服务预览,你试图从本地网络(而不是从Azure实例)访问,并且你的网络阻止出站tcp端口(默认情况下许多公司都这样做)。

你说没有超时,但是你等了多久?我发现在这种情况下需要花费过多的时间(也许是几分钟?)来获得失败,但它们确实来了。异常表示缓存客户端尝试使用的端口号。我见过端口22233和22234,这两个端口都在我的公司网络上被阻止了。当我说服我的IT小组允许通过这些端口的流量时,问题就消失了。

我还没有找到缓存客户端可能想要使用的所有端口的文档,也没有关于该主题的论坛帖子得到解答。

答案 4 :(得分:0)

由于性能计数器初始化,我发现DataCache构造函数无限期挂起。我已经看到了可能导致问题的各种报告,例如安装Office 2013。

我已经通过运行安装Azure Caching NuGet包时添加到项目中的ClientPerfCountersInstaller.exe来修复此问题。

ClientPerfCountersInstaller in Solution Explorer

使用管理权限和cd打开一个命令提示符到此文件夹。然后使用以下命令运行安装程序:

ClientPerfCountersInstaller.exe install

之后,我的项目没有挂起。

答案 5 :(得分:0)

我几个小时都在试图解决这个问题,直到我遇到了这个解释它的堆栈溢出。 TL; DR:该软件包的最新版本与SDK的2.3版不兼容。当我回滚到Azure Caching 2.1时,一切正常。

Exception while using Windows Azure Caching : No such host is known

答案 6 :(得分:0)

我在几小时内与之抗争并通过卸载SDK v2.6并使用SDK 2.4安装来解决。

请参阅下面的说明。 https://www.nuget.org/packages/Microsoft.WindowsAzure.Caching/2.4.0