2008-12-13 94 views
0

我有一个aspx页面,但通过手产生的所有内容(是的,我知道,我需要做出一个处理程序,我还有一个问题)问题与缓存

我想缓存在客户端浏览器的输出。问题在于它只缓存一个查询。

 public static void ProceedCaching(string etag, string lastModify, string response, HttpResponse Response, 
             HttpRequest Request) 
    { 
     Response.AddHeader("ETag", "\"" + etag + "\""); 
     Response.AddHeader("Last-Modified", lastModify); 
     Response.AppendHeader("Cache-Control", "Public"); 
     Response.AppendHeader("Expires", 
           DateTime.Now.AddMinutes(1).ToUniversalTime().ToString("r",DateTimeFormatInfo.InvariantInfo)); 

     string ifModified = Request.Headers["If-Modified-Since"]; 

     if (!string.IsNullOrEmpty(ifModified)) 
     { 
      if (ifModified.Contains(";")) 
       ifModified = ifModified.Remove(ifModified.IndexOf(';')); 
     } 

     string incomingEtag = Request.Headers["If-None-Match"]; 

     if (String.Compare(incomingEtag, etag) == 0 || string.Compare(ifModified, lastModify) == 0) 
     { 
      Response.StatusCode = 304; 
      Response.End(); 
     } 

     Response.Write(response); 
     Response.End(); 
    } 

它变得杂乱无章。 正如我所说,它只缓存一次。收到HTTP 304浏览器后,将发送干净的请求而不缓存信息(etag,lastmodified)。 有什么想法吗?

回答

0

找到这个答案here

一般来说,这些都是遵循最常见的规则(如果你不明白的细节也不用担心,它会在下面解释):

  1. 如果响应的标头告诉 缓存不保留它,则不会。
  2. 如果请求被认证或者 安全,它不会被缓存。
  3. 如果没有验证器(一个ETag或上次修改 头)存在于一个响应, 并且它不具有任何显式 新鲜度信息,这将是 认为不可缓存。
  4. 缓存表示被认为是新鲜 (即,能够被发送到 客户端而不与 原点服务器检查),如果:
    • 它的期满 时间或其他年龄控制头 并且仍然在新鲜的 期间。
    • 如果浏览器缓存已经看到该表示,并且 已设置为检查一次会话。
    • 如果一个代理缓存最近已经看到这个表示,并且它很早以前就被修改了。 直接从缓存中提供新鲜表示 ,而不是 检查源服务器。
  5. 如果表示是陈旧的,则 原始服务器会被要求 验证它,或者告诉缓存 它有副本是否 还是不错的。

Microsoft如果您不希望它缓存的话,它会有一篇好文章。

0

如果我删除在第一行的etag周围添加的引号,则您的代码段可以正常工作。但即时通讯猜测这只是片段中的错误,而不是你面临的真正问题。

Firefox 3 dosnt在接收到第一个304之后,甚至很难打到服务器。IE7继续前进,但它正确发送lastmod/etag头并每次都收到304。

您确定这不是因为您在浏览器中更改了缓存设置吗?我会在另一个浏览器中尝试一下以确保。

为了让它更清洁一些,可以使用Response.Caching中的方法,而不是直接设置标题。

+0

对不起我的缺席(我在度假)我认为你是对的。问题在引号中 – AlfeG 2008-12-15 17:22:27