web-dev-qa-db-ja.com

ASP.NET MVCでETagをサポートするにはどうすればよいですか?

ASP.NET MVCでETagをサポートするにはどうすればよいですか?

61
Patrick Gidich

@ Elijah Gloverの回答 は回答の一部ですが、完全ではありません。これによりETagが設定されますが、サーバー側で確認しないとETagのメリットは得られません。あなたはそれをします:

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
}
43
jaminto

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

ETAG値を作成する方法が必要です。私が見つけた最良の方法は、ファイルMD5または ShortGuid を使用することです。

.netは文字列をETAGとして受け入れるため、次を使用して簡単に設定できます

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

[〜#〜] mix [〜#〜] のビデオ、最後にRESTでETAGを使用

30
Elijah Glover