Asp.net mvc 如何在ASP.NET MVC中支持ETag?
如何在ASP.NET MVC中支持ETAG?MVC中的ETAG与WebForms或HttpHandler相同 您需要一种创建ETAG值的方法,我发现的最好的方法是使用文件MD5或 由于.net接受字符串作为ETAG,因此可以使用Asp.net mvc 如何在ASP.NET MVC中支持ETag?,asp.net-mvc,etag,Asp.net Mvc,Etag,如何在ASP.NET MVC中支持ETAG?MVC中的ETAG与WebForms或HttpHandler相同 您需要一种创建ETAG值的方法,我发现的最好的方法是使用文件MD5或 由于.net接受字符串作为ETAG,因此可以使用 String etag = GetETagValue(); //e.g. "00amyWGct0y_ze4lIsj2Mw" Response.Cache.SetETag(etag); 最后,他们将ETAG与REST一起使用,这是答案的一部分,但并不完全。这将设置ETa
String etag = GetETagValue(); //e.g. "00amyWGct0y_ze4lIsj2Mw"
Response.Cache.SetETag(etag);
最后,他们将ETAG与REST一起使用,这是答案的一部分,但并不完全。这将设置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
}
我认为这是错误的!因为添加一个静态ETag就像是说你的内容永远不会改变。ETags的想法是让浏览器知道内容已更改,类似于过期标题..我认为harcoded值仅用于说明目的。。。你可以在飞行中创造一些东西并改变它。一提到使用MD5,就意味着它是经过计算的(可能只有在每次更改或运行时)并返回的。这显然不是一个使用静态值的建议。这是一个很好的答案,对于那些想要实现它的人来说,我建议实现一个抽象的ActionFilter来实现这个测试逻辑,以及一个名为“abstract string CalculateTag(HttpRequest)”的抽象方法,在需要Etag支持的情况下对它进行子类化。这将使您的操作方法“精简”,并使测试etag生成更容易。ETAGOFCONTENTTOBERETURN中的存储是什么?如何为每个操作生成etag?