0

キャッシュと条件付き GET の両方をサポートする WCF を使用して REST Web サービスを実装しようとしています。

MSDNの指示に従って基本的なキャッシュを実装しました: Caching Support for WCF Web HTTP Services。これは、[AspNetCacheProfile("MyOutputCacheProfile")]各 Web メソッドに属性を追加し、適切なエントリを に追加することを意味しますweb.config。これは正しく動作しているようです。同じ引数が Web メソッドに渡されると、キャッシュされた応答が返されます。

次に、ETag 値を計算し、次のように応答に設定することで、条件付き GET のサポートを追加しました。

WebOperationContext.Current.OutgoingResponse.SetETag(myETag);

そのような動作: ETagWeb メソッドを初めて呼び出したときに、応答にヘッダーが表示されます。

しかし、ここに問題があります。次に同じ引数を使用してその Web メソッドを呼び出すと、キャッシュされた応答が返され、キャッシュされた応答にはETagヘッダーが含まれません。(キャッシュの有効期限が切れるまで待つか、キャッシュを完全に無効にすると、ETag ヘッダーが適切に返されます。)

では、キャッシュされた応答にその ETag 値を含める方法はありますか?


更新:さらに調査と実験を行った結果、これを行うと、キャッシュされたすべての応答に ETag ヘッダーが含まれることがわかりました。

HttpContext.Current.Response.Cache.SetETag(myETag);

WebOperationContext...SetETag()それを呼び出すと、すべてを機能させるために関連する操作を呼び出す必要がなくなります。

これはこれを行う正しい方法ですか?

4

1 に答える 1

0

私が間違っている場合は修正してください。Restful サービスは Http に近く、Http キャッシングは次のように述べています。

HTTP/1.1 でのキャッシュの目的は、多くの場合にリクエストを送信する必要をなくすことと、他の多くの場合に完全な応答を送信する必要をなくすことです。前者は、多くの操作に必要なネットワーク ラウンドトリップの回数を減らします。この目的のために「期限切れ」メカニズムを使用します(セクション13.2を参照)。後者は、ネットワーク帯域幅要件を軽減します。この目的のために「検証」メカニズムを使用します(セクション13.3を参照)。

Asp.net キャッシュは、このカテゴリのいずれにも該当しません (有効期限も検証もありません)。キャッシュは、メソッドを実行する代わりに Web サーバーと IIS でのみ行われ、保存された応答を送信します。RESTful モデルに適合しない方法もあります。

キャッシュを実装するには、キャッシュ コントロール ヘッダーと Etag を応答ヘッダーに追加してから、条件付き Get の処理を​​試みる必要があります。この優れた記事を参照してください。

于 2012-06-19T16:51:31.687 に答える