2017-07-22 27 views
0

ここでは奇妙な問題です。 asp.net webforms(4.5/4.7)のローカル開発では、httpruntime.Cacheが正しく設定されていても常にnullを検出しています。私はそれを別のiis expressワークステーションで試行し、テスターのシングルページWebページでも同じ動作を見つけました。本番IIS 7.5の同じページが動作し、キャッシュから格納して配信しています。コードは具体的には以下の通りですが、私はhttpruntime.Cacheに単純な文字列を格納しているテスターを試しました。iisExpressローカルのhttpruntime.cacheは常にnull

var cache = System.Runtime.Caching.MemoryCache.Default; 
var luCacheKey = "lu_" + dsName; 

var ic = HttpRuntime.Cache.Get(luCacheKey) as ICollection; 
if (ic == null) { 

、そこに私が見ることができるかもしれないweb.configファイルで何かがあるか、これはIIS Expressの動作が期待されている場合は、テスターそう

var item = HttpRuntime.Cache.Get("x"); 
if (item == null) 
{ 
    HttpContext.Current.Cache.Insert("x", "test" , null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration); 
    Response.Write("added to cache<br>"); 
} 
else { 
    Response.Write("already in cache"); 
} 

から、私は疑問に思って?メモ、System.runtime.Cachingは正常に動作します。

var cache = System.Runtime.Caching.MemoryCache.Default; 
var ic = cache[luCacheKey] as ICollection; 
if (ic == null) 
{ 
var filterCriteria = new BinaryOperator("LookupGroup", dsName, BinaryOperatorType.Equal); 
var lookups = xpoSession.GetClassInfo(typeof(Lookups)); 
ic = xpoSession.GetObjects(lookups, filterCriteria, new SortingCollection(), 0, 0, false, false); 
var cachePolicy = new System.Runtime.Caching.CacheItemPolicy() { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(30) }; 
cache.Add(new System.Runtime.Caching.CacheItem(luCacheKey, ic), cachePolicy); 

答えて

2

誤ってオブジェクトをキャッシュに追加します。

DateTime.Nowの代わりにドキュメントに従い、DateTime.UtcNowとしてください。これは、マシンが「ゼロ以外の」タイムゾーンにある一般的な問題を解決します。これにより、キャッシュの内部ロジックが期限切れを正しく管理できなくなります。このパラメータ値のためというよりも、今UtcNow使用し、夏時間ために、このような標準時間からの変更点として、現地時間で可能な問題を回避するために

ドキュメントから

https://msdn.microsoft.com/en-us/library/4y13wyk9(v=vs.110).aspx

+0

あなたWiktor第ありがとうございました!それはそれだった。奇妙なことに、他の場所では動作しているようですが、devマシンでは動作していないようです。私は今やるべきコードの置き換えがたくさんあります!再び、すばやい返信をいただきありがとうございます。 Rep ++ – Davery

+0

私たちは逆を持っていました。これはdevマシンの魅力のように働き、生産に失敗しました。何が問題なのかを知るために1日かかりました。 –

0

振る舞いはサーバ間で変更される可能性があり、なぜ上のフォローアップとして、より多くの情報を追加します。

この動作の変更は、.NET 4.7がマシンにインストールされていることが原因で発生している可能性があります。以下にリンクされている記事によると、Microsoftは次のバージョンの.NETと次の修正プログラムでこれを修正する予定だという。

症状:マイクロソフトのページの一部引用

は、Microsoft .NET Frameworkの4.7 コンピュータにインストールされていると仮定します。 Cache.Insert(文字列、オブジェクト、CacheDependency、DateTime、TimeSpan) 挿入オーバーロードメソッドを使用して、キャッシュオブジェクトにアイテムを挿入しようとすると、挿入されたキャッシュアイテム が指定した時間よりも前または後にDateTime(有効期限 時間)。

原因:

System.Web.Caching.Cacheの内部実装は、絶対有効期限のため 協定世界時(UTC)タイムスタンプを使用します。 しかし、この特定のCache.Insert(文字列、オブジェクト、CacheDependecy、 DateTime、TimeSpan)の挿入オーバーロードメソッドは、 の有効期限がUTCに変換されるかどうかを確認しません。したがって、 のキャッシュオブジェクトにこのオーバーロードを使用して挿入されるアイテムの有効期限は、 グリニッジ標準時(GMT)とのタイムゾーンの違いに応じて、予想より早くまたは遅くなります。

回避策:

この問題の一時的な回避策は、Cache.Add方法または異なるCache.Insert過負荷方法のいずれかを使用することです。

解像度:

この問題は、.NET Frameworkの次期バージョンで修正される予定、とも.NET Frameworkの4.7については、次の修正プログラムで利用できるようになります。

参考文献:

https://support.microsoft.com/en-us/help/4035412/fix-expiration-time-issue-when-you-insert-items-by-using-the-cache-ins

http://vimvq1987.com/2017/08/episerver-caching-issue-net-4-7/