4

Azure プラットフォームで Web API RESTful サービスを開発しています。

デフォルトのクライアント側のキャッシュ動作は、GET リクエストをキャッシュすることだと思いました (GET はべき等であるため)。

驚いたことに、サービスを Azure にデプロイしたとき、すべての応答がCache-Control: privateヘッダーまたはその他のキャッシュを許可しないヘッダーと共に送信されました。

この質問で提案されているソリューションを試してみました。IIS ではローカルで機能しましたが、Azure にデプロイすると機能しませんでした。この機能に関するドキュメントには、RESTful サービスでは非常に基本的だと思っていたものは何も見つかりませんでした。MVC では非常に簡単だったので、明らかな何かが欠けていることを本当に願っています。

tl;dr

GETAzure と Web API を使用する場合、クライアント側で要求をキャッシュする必要があります。

4

3 に答える 3

5

この点で、Azureがあなたに何かをしているとは思いません。リソースに必要なキャッシュプロパティを正確に指定する必要があるのは問題です。

WebAPIを使用すると、プロパティCacheControlHeaderValueを介してアクセスできるを介して、応答が持つキャッシュプロパティを制御できmyHttpResponseMessage.Headers.CacheControlます。

次のようなコントローラーアクションがあったと仮定します。

public Foo Get(int id)
{
    Foo myFoo = LoadSomeFooById(id);

    return myFoo;
}

キャッシングを明示的に制御するには、次のようなことを行う必要があります。

public HttpResponseMessage Get(int id)
{
    Foo myFoo = LoadSomeFooById(id);

    HttpResponseMessage myHttpResponseMessage = this.Request.CreateResponse(HttpStatusCode.OK, myFoo)

    CacheControlHeaderValue cacheControlHeaderValue = new CacheControlHeaderValue(); 
    cacheControlHeaderValue.Public = true;    
    cacheControlHeaderValue.MaxAge = TimeSpan.FromMinutes(30);

    myHttpResponseMessage.Headers.CacheControl = cacheControlHeaderValue;

    return myHttpResponseMessage;
}

期待するキャッシュに関連する他の多くのプロパティもCacheControlHeaderValueクラスで使用できます。これは最も基本的な例にすぎません。

また、私の例は非常にブルートフォース/単純であり、すべてのキャッシング動作/ロジックがアクションメソッドに含まれていることを覚えておいてください。よりクリーンな実装はActionFilterAttribute、属性設定に基づいてすべてのキャッシングロジックを含み、それをに適用することHttpResponseMessageです。HttpResponseMessage次に、よりモデル中心のアクションメソッドシグネチャに戻すことができます。これは、この場合、そのレベルでもうアクセスする必要がなくなるためです。いつものように、猫の皮を剥ぐ方法はたくさんあり、特定の問題領域に最適な方法を決定する必要があります。

于 2013-02-14T23:05:44.380 に答える
0

これをお勧めします https://github.com/filipw/AspNetWebApi-OutputCache

シンプルで素早く、キャッシュするためのさまざまなオプションがあります。

それが役立つことを願っています

于 2015-03-12T16:22:36.823 に答える
0

このhttp://forums.asp.net/post/4939481.aspxを見てください。HTTP 応答を変更する属性としてキャッシュが実装されています。

免責事項:私は試していません。

于 2013-02-17T09:22:17.670 に答える