如何在ASP.NET MVC中支持ETag?

Pat*_*ich 62 asp.net-mvc etag

如何在ASP.NET MVC中支持ETag?

jam*_*nto 44

@Elijah Glover的答案是答案的一部分,但并不完全正确.这将设置ETag,但是如果不在服务器端检查它,你就无法获得ETag的好处.你这样做:

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

此外,另一个提示是您需要设置响应的可缓存性,否则默认情况下它是"私有",并且不会在响应中设置ETag:

Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
Run Code Online (Sandbox Code Playgroud)

这是一个完整的例子:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,对于那些希望实现这一点的人,我建议实现一个实现此测试逻辑的抽象ActionFilter,以及一个名为"抽象字符串CalculateEtag(HttpRequest)"的抽象方法,为需要Etag支持的每个案例进行子类化.这将使您的Actions方法"瘦",并使测试etag生成更容易. (3认同)

Eli*_*ver 30

MVC中的ETAG与WebForms或HttpHandlers相同.

您需要一种创建ETAG值的方法,我发现使用File MD5或ShortGuid的最佳方法.

由于.net接受一个字符串作为ETAG,您可以使用它轻松设置它

String etag = GetETagValue(); //e.g. "00amyWGct0y_ze4lIsj2Mw"
Response.Cache.SetETag(etag);
Run Code Online (Sandbox Code Playgroud)

来自MIX的视频,最后他们使用ETAG和REST

  • 我认为该编码的值仅用于说明目的......您可以动态创建并更改它. (7认同)
  • 我觉得这是错的!因为添加静态ETag就像是说你的内容永远不会改变.ETags的想法是让浏览器知道内容已经改变,类似于到期头. (2认同)