在ASP.NET MVC4 WebAPI中实现ETag支持

Bul*_*nes 17 asp.net-mvc-4 asp.net-web-api

在最新的ASP.NET MVC4测试版中,您如何通过ETag支持条件GET支持?ActionFilter需要能够完成为返回的资源生成ETag的请求,以便与请求中的If-None-Match标头进行比较.然后,无论If-None-Match标头中的传入ETag是否与生成的ETag相同,都将生成的ETag添加到ETag响应头.但是使用ASP.NET MVC4,我不知道从哪里开始.有什么建议?

Luk*_*ett 16

就个人而言,我不是"框架魔术"的粉丝,更喜欢网络方法中的普通旧代码,否则我们最终得到的东西更像是WCF,yuk.

因此,在Get Web方法中,手动创建响应,如下所示:

var response = this.Request.CreateResponse(HttpStatusCode.OK, obj);
string hash = obj.ModifiedDate.GetHashCode().ToString();

response.Headers.ETag =
    new EntityTagHeaderValue(String.Concat("\"", hash, "\""), true);

return response;
Run Code Online (Sandbox Code Playgroud)

请注意,从时间戳的哈希码生成的ETag纯粹说明了弱实体标记系统.它还显示了所需的额外报价.


Ali*_*tad 9

WebApiContrib中有一个ETagMessageHandler 可以满足您的需求.


UPDATE

我在WebApiContrib中实现了RFC 2616的服务器端缓存.寻找CachingHandler.更多信息在这里.


更多更新

这将在CacheCow下积极开发和扩展.这将包括客户端和服务器组件.即将发布的NuGet包 现已发布.

WebApiContrib的CachingHandler仍然会被维护,所以任何错误或问题请告诉我.


Gre*_*Coy 5

Luke Puplett 的回答让我走上了正确的轨道 (+1),但请注意,您还必须阅读服务器端的 ETag,以避免随每个请求发送所有数据:

string hash = obj.ModifiedDate.GetHashCode().ToString();
var etag = new EntityTagHeaderValue(String.Concat("\"", hash, "\""), true);

if (Request.Headers.IfNoneMatch.Any(h => h.Equals(etag)))
{
    return new HttpResponseMessage(HttpStatusCode.NotModified);
}

var response = this.Request.CreateResponse(HttpStatusCode.OK, obj);
response.Headers.ETag = etag;
return response;
Run Code Online (Sandbox Code Playgroud)

尊重If-Modified-Since标题也是一个好主意。请参阅RFC 2616