2011-10-13 125 views
8

给定一个文件作为http请求的一部分返回。为该文件创建ETag的正确方法是什么?如何在c#中生成http ETag?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19

我已经看到它有多种方式

+2

语义上ETag在内容更改时应该更改...所以哈希似乎是合适的...但是ETag必须在不同的URL和/或重复文件的不同时间戳上是唯一的......所以要安全地对文件进行散列,并与时间戳和url以及散列连接起来...... – Yahia

+0

@Yahia你应该做出这个评论回答 – Simon

+0

现在做了:-) – Yahia

回答

12

答案的哈希值是它依赖。

Etags有两种,弱和强的。弱者让你做某些有条件的操作,但其中大多数需要强大的etags。

强etag的唯一限制是,如果表示出于任何原因而改变,那么etag也是如此。如果它是一个文件,你可以生成一个散列,但是这会迫使你在生成时将这个实体保存在内存中。或者,您可以简单地流式传输内容并将Etag添加为尾随的HTTP标头,但几乎没有服务器当前支持该功能(非常有用且不受欢迎)。

刻度具有较低的分辨率,即使内容不同,可能同一文件上的两个连续写入会具有相同数量的刻度。在那个阶段,etag现在是无效的,如果它强壮并且你在浑水中。真正与Last-Modified一样的问题。大多数HTTP服务器处理的方式是给文件一个etag,它基于它的多个属性,又名时间戳,大小和可能的文件对象ID(apache中的inode,可能在NT上添加对象存储条目的完整路径,以及IIS也会为该值添加一个计数器,因此如果更改了某个服务器上的两个配置更改,则会生成不同的etags)。

如果你使用某种类型的数据库,那么id +版本应该是一个强大的etag(再次提供,你所拥有的内容不是多个东西的集合,每个东西都可以独立更改, )。

那么如何计算它真的取决于你的场景,并且在写入之前坚持写文件(在开始服务之前)对你最有帮助,尤其是因为这是一个非常有用的功能,因为其他许多原因。

所以哈希似乎是恰当的......但ETag的,还必须对不同的URL和/或重复的文件不同的时间戳独特的...所以是:

8

语义上ETag的应该当内容的变化而变化在安全的一面散列文件,将其与最后一次修改的时间戳以及url和哈希再次连接...