从ASP.NET中的内容创建ETag

时间:2015-04-10 16:46:42

标签: asp.net http http-caching

有没有办法通过散列内容来为aspx页面创建和http-ETag?

我有什么:

一个网站,其中html代码在大多数情况下为每个用户(登录后)保持不变。在从服务器获取html之后,使用xhr-requests加载所有真正动态的内容。目前,在每次请求期间,相同的未更改的html代码将传输到客户端。

我想要的是什么:

由于html没有正常更改,我想将etag设置为实际html内容的哈希值。这样,浏览器就可以发出if-none-match请求,通常可以通过304响应(“未修改”)来回答。只有内容确实发生了变化,才会重新传输完整的代码。

ASP.NET(或IIS)是否提供了实现这一目标的方法?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,但我不确定我是否喜欢它。但是如果你想这样做,请自己决定。

此处介绍了基本设置:How do I retrieve response html from within a HttpModule?

  1. 注册IHttpModule
  2. " Init"为事件注册听众" BeginRequest"," PreSendRequestHeaders"和" PreSendRequestContent"。
  3. 在" BeginRequest"期间,将StreamWatcher添加为过滤器
  4. 在" PreSendRequestHeaders"从StreamWatcher创建ETag。如果请求包含" if-none-match",请对其进行评估并采取相应的行动。
  5. 可选:在" PreSendRequestContent"发送requestHeaders后,确保内容不再发生变化。 " PreSendRequestContent"如果将多个代码块发送到客户端,将被多次调用。
  6. 可能的问题:

    • Response.Buffer必须为true(默认值):所有数据都被缓冲,所有内容最终都会发送到客户端。如果响应太大,则抛出异常(也是默认行为,没有" auto-intermediate-flush")
    • 你不能打电话给#34; Response.Flush()"在您的代码中,因为标题是在内容准备好之前发送的。您可以通过上面的可选检查来检测此类问题。
    • 内容占用了所需内存的两倍,因为它被缓冲两次:一次在实际响应中,一次使用StreamWatcher。