Asp.net mvc 4 在ASP.NET MVC4 WebAPI中实现ETag支持

Asp.net mvc 4 在ASP.NET MVC4 WebAPI中实现ETag支持,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,在最新的ASP.NET MVC4测试版中,您将如何支持通过ETag获得支持?ActionFilter需要能够完成请求,为返回的资源生成ETag,以便与请求中的If None Match头进行比较。然后,不管If None Match报头中的传入ETag是否与生成的ETag相同,都将生成的ETag添加到ETag响应报头。但是对于ASP.NETMVC4,我不知道从哪里开始。有什么建议吗?中有一个ETagMessageHandler,可以满足您的需要 更新 我已经在WebApiContrib中实现了

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

中有一个ETagMessageHandler,可以满足您的需要


更新 我已经在WebApiContrib中实现了RFC2616的服务器端缓存。寻找卡辛德勒。 更多信息


更多更新 这将在下积极开发和扩展。这将包括客户端和服务器组件。即将出版的书现在就出版了


WebApiContrib的CachingHandler仍将得到维护,因此任何错误或问题请告诉我。

就我个人而言,我不喜欢“框架魔术”,更喜欢在web方法中使用简单的旧代码,否则我们会得到更类似于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;

请注意,由时间戳的哈希代码生成的ETag纯粹是弱实体标记系统的说明。它还显示了所需的附加报价。

这似乎就是您要寻找的(请参阅“ETag支持”一节):

如果您的模型存储在域中更深的位置,并且您无法应用[ConcurrencyCheck]属性,您可以使用ODataModelBuilder执行此操作:

ODataModelBuilder builder = new ODataConventionModelBuilder();
var myEntity = builder.EntitySet<MyEntity>("MyEntities"); 
myEntity.EntityType.Property(l => l.Version).ConcurrencyToken = true;
ODataModelBuilder=new ODataConventionModelBuilder();
var myEntity=builder.EntitySet(“MyEntities”);
myEntity.EntityType.Property(l=>l.Version).ConcurrencyToken=true;

这将使您能够将“@odata.etag”属性添加到响应正文中。

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;
如果修改了
,那么最好尊重
,因为
标题。看