.net 从半长操作的结果生成ETag?

.net 从半长操作的结果生成ETag?,.net,asp.net-mvc-4,caching,etag,.net,Asp.net Mvc 4,Caching,Etag,我正试图了解一些缓存技术,我现在正在研究的是etag/conditional get。据我所知,你通常做的是: 提出请求。如果可用,客户端将在etag头中提供一个哈希 操作运行并获取结果对象 从该结果对象,您可以通过MD5哈希等方法生成etag 如果etag在请求中,则比较它们。如果它们匹配,则返回未修改的内容,否则返回内容和新etag。 考虑到整体情况,我有点困惑。在所有情况下,我都可以看到,使用未修改的响应可以节省不必要的响应正文的额外字节,但这对服务器处理时间有什么影响?相反,它似乎什么也

我正试图了解一些缓存技术,我现在正在研究的是etag/conditional get。据我所知,你通常做的是:

提出请求。如果可用,客户端将在etag头中提供一个哈希 操作运行并获取结果对象 从该结果对象,您可以通过MD5哈希等方法生成etag 如果etag在请求中,则比较它们。如果它们匹配,则返回未修改的内容,否则返回内容和新etag。 考虑到整体情况,我有点困惑。在所有情况下,我都可以看到,使用未修改的响应可以节省不必要的响应正文的额外字节,但这对服务器处理时间有什么影响?相反,它似乎什么也不做,因为服务器仍然必须生成响应对象,该对象包括它到达那里所需的所有后续进程。例如,如果操作非常复杂,需要几秒钟才能完成该怎么办。不管输出是否相同,它仍然必须完成操作才能生成结果对象的哈希


我觉得我没有正确地看待这种方法的目的。ETag是否仅用于静态资源(如文件)而不是各种进程的结果资源?例如,图像是etag的一个很好的用途,但是像销售历史这样的报告呢?这是使用ETag和常规缓存之间的分界线还是我遗漏了一部分?场景中的示例将非常有用。

您可以像您可能知道的任何其他缓存机制一样使用HTTP的ETag缓存机制。将其视为缓存密钥。您不从结果生成密钥,而是获取输入参数

因此,假设您拥有资源/映像?id=bob&dimension=100x100。这将从数据库中获取Bob的图片,将其缩小到100x100并返回给客户端。不要对缩放图像进行散列,而是散列输入参数:bob和100x100。如果您的服务器收到该请求,它只需检查数据库中是否存在Bob并返回一个304