且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

我如何支持ASP.NET MVC的ETag?

更新时间:2023-02-25 08:47:30

@Elijah Glover的答案是答案的一部分,但没有真正完成。这将设置ETag的,但你不能没有检查它在服务器端获得的ETag的好处。你这样做有:

@Elijah Glover's answer is part of the answer, but not really complete. This will set the ETag, but you're not getting the benefits of ETags without checking it on the server side. You do that with:

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

此外,另一个技巧是,你需要设置响应的缓存能力,否则默认情况下它是私人和ETag的不会响应进行设置:

Also, another tip is that you need to set the cacheability of the response, otherwise by default it's "private" and the ETag won't be set in the response:

Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);

因此​​,一个完整的例子:

So a full example:

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
}