2009-06-02 23 views

答えて

41

@Elijahグローバーの答えはの一部であります答えは、実際には完全ではありません。これでETagが設定されますが、サーバー側でチェックすることなくETagsの利点を得ることはできません。

var requestedETag = Request.Headers["If-None-Match"]; 
if (requestedETag == eTagOfContentToBeReturned) 
     return new HttpStatusCodeResult(HttpStatusCode.NotModified); 

また、別の先端がそうでなければ、デフォルトでは、それは「プライベート」だとのETagが応答して設定されることはありません、あなたはレスポンスのキャッシュ可能性を設定する必要があるということです:

あなたがそれを行います
Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate); 

だから、完全な例:私はこれは間違っていると思う

public ActionResult Test304(string input) 
{ 
    var requestedETag = Request.Headers["If-None-Match"]; 
    var responseETag = LookupEtagFromInput(input); // lookup or generate etag however you want 
    if (requestedETag == responseETag) 
     return new HttpStatusCodeResult(HttpStatusCode.NotModified); 

    Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate); 
    Response.Cache.SetETag(responseETag); 
    return GetResponse(input); // do whatever work you need to obtain the result 
} 
+3

これは良い答えです。これを実装するには、このテストロジックを実装する抽象ActionFilterと抽象メソッド "Abstract string CalculateEtag(HttpRequest)"を実装し、Etagが必要な各ケースに対してサブクラス化することをお勧めしますサポート。これは、あなたのアクションメソッドをスキニーに保ち、エタグ生成のテストを容易にします。 –

+0

eTagOfContentToBeReturnedのストアは何ですか?どのように各アクションのためのエタグを生成する? –

30

ETAGのMVCはWebFormsまたはHttpHandlersと同じです。

ファイルMD5またはShortGuidを使用している最善の方法で、ETAG値を作成する方法が必要です。

.NETはETAGなどの文字列を受け付けているので、あなたはMIXから

String etag = GetETagValue(); //e.g. "00amyWGct0y_ze4lIsj2Mw" 
Response.Cache.SetETag(etag); 

ビデオを使用して簡単に設定することができ、彼らが使用する最後にETAGのRESTと

+2

!静的なETagを追加すると、あなたのコンテンツは決して変化しないということになります。 ETagsのアイデアは、期限切れのヘッダーと同様に、コンテンツが変更されたことをブラウザに知らせることです。 –

+6

私は、harcodedの値は、説明のためのものだと思います...あなたはその場で何かを作成して変更することができます。 – Romias

+1

確かに。 MD5を使用することの非常に言及は、それが計算されていることを示唆しています(たぶん、それが変更された場合、または毎回変更された場合のみ)、返されます。静的な値を使用することは、明らかに示唆ではありません。 –

関連する問題