1

私は本当に奇妙な問題を抱えていて、完全に困惑しています。

Insert メソッドを使用して、一部のデータを解析し、結果を Web サーバーの HttpRuntime.Cache に格納するコードがあります。これは 10 秒間保存されます。いくつか問題があるようですので、単純なオブジェクトをキャッシュから取得し、null かどうかを表示するテスト ページを作成しました。オブジェクトをキャッシュに追加するには、次を使用します。

HttpRuntime.Cache.Insert(CHECK_KEY, new object(), null, DateTime.Now.AddSeconds(10), System.Web.Caching.Cache.NoSlidingExpiration);

テスト ページで、オブジェクトの取得を試みます。

var isInCache = this.cacheService.Get<object>(CHECK_KEY) != null;

cacheService のメソッドは次のとおりです。

public T Get<T>(string key)
{
  return (T)HttpRuntime.Cache.Get(key);
}

今奇妙な部分。'Insert' メソッドを呼び出す URL を呼び出し、テスト ページに移動してそれを取得すると、約 99% の確率での値isInCacheが得られます。false10 秒間正しく動作することもあります (たとえば、テスト ページを 1 秒ごとに更新するとtrue10 回表示されます) が、ほとんどの場合はfalse. 今、F5 を押し続けると、瞬く間に出力に表示されることtrueがあります。これは、キーが見つかることを意味します! これは一部のブラウザー キャッシュではありませんtrue。10 秒間のキャッシュ期間の間、断続的にしか点滅せず、その後は false のみが表示されるためです (キーの有効期限が切れているため、これは論理的です)。だから私の質問は:

  • ほとんどの場合、単純なオブジェクトをキャッシュから取得すると失敗するのはなぜですか?
  • キャッシュ内 (同じテスト ページ上) には、そのオブジェクトではなく、取得される他のアイテムがあります。

さらに悪いことに、これは (もちろん!) 私のローカル マシン、テスト マシンでは問題なく動作しますが、本番環境では動作しません。私はかなり無知です。助けてください :-)

編集: わかりましたので、IE9 と Chrome の 2 つの異なるブラウザーでテストしています...IE9 は HttpRuntime.Cache の項目を正しく表示していますが、Chrome はそうではありません。F5 を押したままにしておくと時々表示される場合を除いて、常に false が表示され、他のキャッシュ データは表示されません。いつから HttpRuntime.Cache ブラウザに依存するのですか??? 余分な編集: IE9 はキャッシュされたデータを表示しません。したがって、ブラウザーによって異なる場合がありますが、IE が常に機能し、クロムが機能しないというわけではありません...違います。

EDIT2: したがって、ViewDataを使用してビューに変数を渡しています:

ViewData["machineName"] = machineName;
ViewData["isInCache"] = isInCache;
ViewData["A"] = A;
ViewData["B"] = B;

Machinename は Server.MachineName から取得され、isInCache はオブジェクトであり、変数 A は HttpRuntime.Cache から取得されたものではありません。変数 B も断続的に存在しません。

4

1 に答える 1

1

多くのデバッグと検討の後、ホスティング プロバイダーの IIS 7 アプリケーション プール設定の「最大ワーカー プロセス」が 1 より大きい値に設定されているように見えました。HttpRuntime.Cache は Web ファームで共有されていないため、オブジェクトがキャッシュされていない「間違った」インスタンスにヒットしました。F5 キーを押し続けると、値がキャッシュされたインスタンスにヒットすることがありました。

于 2012-06-15T13:44:13.023 に答える