DataCacheFactory
Microsoft でチケットを開いた後、静的オブジェクトを持つことに絞り込みました。
public class AppFabricCacheProvider : ICacheProvider
{
private static readonly object Locker = new object();
private static AppFabricCacheProvider _instance;
private static DataCache _cache;
private AppFabricCacheProvider()
{
}
public static AppFabricCacheProvider GetInstance()
{
lock (Locker)
{
if (_instance == null)
{
_instance = new AppFabricCacheProvider();
var factory = new DataCacheFactory();
_cache = factory.GetCache("AdMatter");
}
}
return _instance;
}
...
}
AppFabric からの s を見るとtracelog
、クライアントはホストのダウンを処理せずにすべてのホストに接続しようとしています。クライアントで IIS をリセットすると、強制的に新しいDataCacheFactory
ものが作成され (私たちの でApp_Start
)、例外が停止します。
MS エンジニアは、このアプローチがベスト プラクティスであることに同意しました (これに関する記事もいくつか見つかりました。リンクとリンクを参照してください) 。
彼らは私たちのために解決策を調査し続けています. 当面の間DataCacheFactory
、上記の例外のいずれかが発生した場合に新しいオブジェクトを強制的に作成する、次の一時的な回避策を考え出しました。
public class AppFabricCacheProvider : ICacheProvider
{
private const int RefreshWindowMinutes = -5;
private static readonly object Locker = new object();
private static AppFabricCacheProvider _instance;
private static DataCache _cache;
private static DateTime _lastRefreshDate;
private AppFabricCacheProvider()
{
}
public static AppFabricCacheProvider GetInstance()
{
lock (Locker)
{
if (_instance == null)
{
_instance = new AppFabricCacheProvider();
var factory = new DataCacheFactory();
_cache = factory.GetCache("AdMatter");
_lastRefreshDate = DateTime.UtcNow;
}
}
return _instance;
}
private static void ForceRefresh()
{
lock (Locker)
{
if (_instance != null && DateTime.UtcNow.AddMinutes(RefreshWindowMinutes) > _lastRefreshDate)
{
var factory = new DataCacheFactory();
_cache = factory.GetCache("AdMatter");
_lastRefreshDate = DateTime.UtcNow;
}
}
}
...
public T Put<T>(string key, T value)
{
try
{
_cache.Put(key, value);
}
catch (SocketException)
{
ForceRefresh();
_cache.Put(key, value);
}
return value;
}
詳細がわかり次第、このスレッドを更新します。