2012-04-20 12 views
2

私はISSでMVC3ウェブサイトを実行しています。私たちには、データベースからイメージを取得するコントローラがあります。どのイメージが実際にフェッチされるかは、リクエストのホスト名に基づいて決定されます。 http://hostA.site.com/image/23は、両方のURLがIISの同じアプリケーションを参照していても、http://hostB.site.com/image/23とは異なる画像を返します。IISとホスト名のASP.NETキャッシュ

キャッシングが有効になるまでは正常に動作します。私は、サーバーとクライアントの両方をキャッシュできるようにするには、次のコードを使用:

Response.Cache.SetExpires(DateTime.Now.AddHours(1)); 
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public); 

これは、IISは、私たちが見てみたい正確に何である応答をキャッシュする原因となります。しかし、キャッシュするときにIISは異なるホスト名を区別しないようです。最初にhttp://hostA.site.com/image/23を取得すると、http://hostB.site.com/image/23への後続の呼び出しによって、IISは以前の要求からキャッシュされたイメージを返します。私は、同じサイトと同じURIを持つため、IISはそれらの要求が同じであるとみなすため、これが発生すると想定しています。

ホストごとに異なるアプリケーションを作成することなく、誰でもこの作業を行う方法を知っていますか?私はPrivate for Cacheabilityを今のところ設定しましたが、私は本当にIISキャッシュにそれらのイメージを持っていたいと思います。

+0

ここに配置するコマンドは、クライアント用です。コードをソースコードの背後にあるコードにキャッシュすると、コードはURLがどのように提供されているかを知りませんでした。あなたはそれを使用する場合、サーバーのキャッシュを見て変更することができますか? – Aristos

+0

キャッシュはサーバー上で発生します(HttpCacheability.Publicを設定すると)、ローカルにキャッシュされないwgetを使用してこれを検証しました。一度私はHttpCacheability.Privateを設定すると、IISはキャッシュを停止します。 IISの内部キャッシュにどのようにピークを当てるのか分からないので、何が起こっているのか分からない。 – AVee

答えて

0

キャッシングはサーバーではなくクライアントで行われます。したがって、コンテンツの有効期限ヘッダーを提供するために使用している場合を除いて、IISはここでは問題になりません。

両方のURLが同じアプリケーションを参照している場合、URLに関係なく同じ有効期限ヘッダーが追加されます。このコードは、呼び出し元URLを明示的に見て、それに応じて送信するレスポンスを調整しない限り、両方の場合に実行されます。

var url = Request.Url.Host; 
// Determine which host was called. 
// Adjust cache to either 0 or 1 hour based on this 
+0

キャッシュの設定は問題ではなく、各ホストで同じにする必要があります。ただし、レスポンスの内容はRequest.Url.Hostごとに異なる必要があります。しかし、私はHttpCacheability.Public IISを設定すると、SiteBへのリクエストが行われたときにSiteAへの前回の呼び出しの応答を返すようになったので、wgetを使ってこれを検証しました。また、SiteBの要求がSiteAの要求の直後に行われたときにコードがヒットしないこともデバッガに示されています。 HttpCacheability.Privateを設定すると、すべてが再び機能しますが、実際にはIISがキャッシュする(ただし正しく)ようにします。 – AVee

関連する問題