我在Windows Azure上运行了一个缓存实例。我正在从我的Web应用程序连接到它,并通过以下消息获得间歇性异常:
ErrorCode:SubStatus:暂时失败。 请稍后重试。 (一个或多个指定的缓存服务器是 不可用,这可能是由繁忙的网络或服务器引起的。对于 内部部署缓存集群,还验证以下条件。 确保已为此客户端授予安全权限 帐户,并检查是否允许AppFabric缓存服务 通过所有缓存主机上的防火墙。还有MaxBufferSize server必须大于或等于序列化对象大小 从客户发送。)附加信息:客户正在尝试 与服务器通信: 的net.tcp://myserver.cache.windows.net:22234
我已经能够在LinqPad中使用此片段复制问题
var config = new DataCacheFactoryConfiguration
{
AutoDiscoverProperty = new DataCacheAutoDiscoverProperty(true, "myserver.cache.windows.net"),
SecurityProperties = new DataCacheSecurity("key", false)
};
var factory = new DataCacheFactory(config);
var client = factory.GetDefaultCache();
//client.Put("foo", "bar");
for (int i = 0; i < 100; i++)
{
System.Threading.Tasks.Task.Factory.StartNew(o => {
var i1 = (int)o;
try
{
client.Get("foo").Dump();
} catch (Exception e)
{
e.Message.Dump();
}
}, i);
}
如果我按原样运行此代码段,产生超过50个线程,我就会收到错误消息。如果我取消注释初始Put(),我可以用10,000个线程运行它。在运行之前,我确保该条目位于缓存中。我尝试过使用悲观锁定,似乎没有任何效果。我使用过NuGet的最新客户端DLL。我已经尝试将缓存扩展到1GB,除了这个片段之外别无用处。
由于我在我的网络应用程序中的请求是在不同的主题上进行的,我相信这可以合理地模拟我的应用程序中发生的事情。在这两种情况下,我肯定会得到同样的例外。任何人都可以建议避免这种异常的方法吗?是否与构造函数在同一个线程上发生的初始Put()有关?这似乎不太可能,但在这个测试场景中我唯一可以做的就是消除异常。