MemoryCache (System.Runtime.Caching) に問題があります。このオブジェクトに関する他の質問で、ドメイン未処理の例外の後に値がキャッシュされていないことがわかりました。
例外は次のとおりです。
Exception: System.TypeInitializationException
Message: The type initializer for 'System.Web.Util.ExecutionContextUtil' threw an exception.
Trace:
at System.Web.Util.ExecutionContextUtil.RunInNullExecutionContext(Action callback)
at System.Web.Hosting.ObjectCacheHost.System.Runtime.Caching.Hosting.IMemoryCacheManager.UpdateCacheSize(Int64 size, MemoryCache memoryCache)
at System.Runtime.Caching.CacheMemoryMonitor.GetCurrentPressure()
at System.Runtime.Caching.MemoryMonitor.Update()
at System.Runtime.Caching.MemoryCacheStatistics.CacheManagerThread(Int32 minPercent)
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading._TimerCallback.PerformTimerCallback(Object state)
Caused by Exception: System.Exception Message: Type 'System.Threading.ExecutionContext' does not have a public property named 'PreAllocatedDefault'.
Trace: at System.Web.Util.ExecutionContextUtil.GetDummyDefaultEC()
at System.Web.Util.ExecutionContextUtil..cctor()
例外は2〜5分後にスローされるようです。キャッシュが破棄されないため、この例外を解決することで問題が解決すると思います。
昨日19時から3ヶ月使ってるのに問題発生… 12日から生産に変化なし サーバーは Azure でホストされています (OS は Windows Server 2008 R2 です)
例外ハンドラの編集
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e) {
System.Threading.Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Global_UnhandledException);
System.Threading.Thread.GetDomain().DomainUnload += new EventHandler(Global_DomainUnload);
}
}
MemoryCache ラッパー
public abstract class MemoryCacheManager : ICacheManager
{
private MemoryCache MemoryCache;
protected MemoryCacheManager()
{
MemoryCache = new MemoryCache("Common.Utils.MemoryCacheManager");
}
private void ItemRemoved(CacheEntryRemovedArguments arguments)
{
switch (arguments.RemovedReason)
{
case CacheEntryRemovedReason.CacheSpecificEviction:
LogManager.Instance.Log(arguments.CacheItem.Key + " : CacheSpecificEviction");
break;
case CacheEntryRemovedReason.ChangeMonitorChanged:
LogManager.Instance.Log(arguments.CacheItem.Key + " : ChangeMonitorChanged");
break;
case CacheEntryRemovedReason.Evicted:
LogManager.Instance.Log(arguments.CacheItem.Key + " : Evicted");
break;
case CacheEntryRemovedReason.Expired:
LogManager.Instance.Log(arguments.CacheItem.Key + " : Expired");
break;
case CacheEntryRemovedReason.Removed:
LogManager.Instance.Log(arguments.CacheItem.Key + " : Removed");
break;
}
}
#region ICacheManager
public void Add(string key, object value, DateTimeOffset absoluteExpiration)
{
var policy = new CacheItemPolicy { AbsoluteExpiration = absoluteExpiration, RemovedCallback = ItemRemoved };
Add(key, value, policy);
}
public void Add(string key, object value, TimeSpan slidingExpiration)
{
var policy = new CacheItemPolicy { SlidingExpiration = slidingExpiration, RemovedCallback = ItemRemoved };
Add(key, value, policy);
}
private void Add(string key, object value, CacheItemPolicy policy)
{
MemoryCache.Add(key, value, policy);
LogManager.Instance.Info(DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss") + " " + key + " : Added");
}
public object Get(string key)
{
return MemoryCache.Get(key);
}
public bool Exist(string key)
{
return MemoryCache.Contains(key);
}
public bool Remove(string key)
{
return MemoryCache.Remove(key) != null;
}
#endregion
}
キャッシュマネージャー
public class CacheManager : MemoryCacheManager
{
#region Singleton
private static readonly CacheManager instance = new CacheManager();
// Explicit static constructor to tell C# compiler ot to mark type as beforefieldinit
static CacheManager() { }
private CacheManager()
: base()
{
}
public static CacheManager Instance
{
get
{
return instance;
}
}
#endregion
}
Global_UnhandledException の最初の呼び出しの後、すべての CacheManager.Instance.Get が null を返します。
私の質問は次のとおりです。この例外を回避するにはどうすればよいですか? または、メモリキャッシュを正常に動作させる方法