如何在c#中生成http ETag?

Sim*_*mon 9 c# etag http

给定一个文件作为http请求的一部分返回.为该文件创建ETag的正确方法是什么?

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

我看过它有几种方法

Ser*_*Seb 13

答案是,这取决于.

有两种Etags,弱和强.弱者允许你做某些条件操作,但是大多数都需要强大的etags.

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

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

如果您使用某种类型的数据库,那么id +版本应该是一个强大的etag(再次提供,您所拥有的内容不是多个事物的集合,每个事物可以独立地更改而没有根更改版本).

所以如何计算它实际上取决于你的场景,并且在写入时(在开始服务之前)持久保存文件的哈希值可能对你有所帮助,特别是因为它是一个非常有用的功能,有许多其他原因.


Yah*_*hia 8

从语义上讲,ETag应该在内容发生变化时发生变化:

所以Hash似乎是合适的......但是ETag在不同的URL和/或重复文件的不同时间戳上也必须是唯一的...所以要安全地散列文件,将其与最后修改的时间戳连接起来网址和哈希再次......