我正在创建一个新的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。
有谁知道这个的原因?考虑到它有多新,我猜它的东西非常基本。
答案 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
来修复此问题。
使用管理权限和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