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