我有一个页面GetImage.aspx,用于从数据库中取出图片,然后Response.BinaryWrite到页面上。
在另外一个页test.aspx使用<IMG src="GetImage.aspx> 显示图片。
因为我不想每次刷新test.aspx的时候,让GetImage.aspx读数据库,然后Response.BinaryWrite,
所以我设置GetImage.aspx的页面缓存,设置方法如下所示。
Response.Cache.SetExpires(System.DateTime.Now.AddSeconds(0.1));   
Response.Cache.SetCacheability(System.Web.HttpCacheability.Server);   可是这个缓存好像没起到作用,我每次刷新test.aspx的侍候,
GetImage.aspx还是执行从数据库中取得数据,然后Response.BinaryWrite的代码?为什么

解决方案 »

  1.   

    http://zhidao.baidu.com/question/56447556.html?fr=qrl&fr2=query&adt=3_869
      

  2.   

    顶部加<%@ OutputCache Duration="3600" VaryByParam="None" %>
      

  3.   

    Duration  
    页或用户控件进行缓存的时间(以秒计)。在页或用户控件上设置该属性为来自对象的 HTTP 响应建立了一个过期策略,并将自动缓存页或用户控件输出。  
    注意   该属性是必需的。如果未包含该属性,将出现分析器错误。 VaryByParam  
    分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用 GET 方法属性发送的查询字符串值对应,或与用 POST 方法发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括 none、* 和任何有效的查询字符串或 POST 参数名称。  
    警告   在输出缓存 ASP.NET 页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的 @ OutputCache 指令中包含了 VaryByControl 属性。如果没有包含它,则发生分析器错误。如果您不想使缓存内容随任何指定参数发生变化,请将该值设为 none。如果要使输出缓存根据所有参数值发生变化,请将属性设置为 *。 
      

  4.   


    那个顶部?GetImage.aspx的页面顶部?我用Response.write("<%@ OutputCache Duration="3600" VaryByParam="None" %> ")可以么?
      

  5.   

    是不是在缓存期间内,就不执行GetImage.aspx的C#代码了?
    可是不行啊。我这里还是每次调用这个页面都执行C#代码。
    错那里了呢?
      

  6.   

    你试下Response.write是从顶部第一行写出来的
    如果不行只能把整个页面代码都用Response.write写出来,如
    Response.write(" <%@ Page Language="C#" AutoEventWireup="true" CodeFile="NewsEditor.aspx.cs" Inherits="manage_news_NewsEditor" ValidateRequest="false" %>  <%@ OutputCache Duration="3600" VaryByParam="None" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body></body></html>");
    Response.End();
      

  7.   

    我的GetImage.aspx代码是这样的: private void Page_Load(object sender, System.EventArgs e)
    {
    byte[] image=GetBinaryImage();
    WriteImage(binaryImage);
    }
    private void WriteImage(byte[] b)
    { Response.ClearContent();;
    Response.Write ("<%@ OutputCache Duration=\"3600\" VaryByParam=\"None\" %> ");
    Response.ContentType = "image/JPEG";
    Response.BinaryWrite(b);
    }
    每次调用这个页面,都会执行Page_Load中的代码。
    好像页面根本没有缓存。为什么?
    不行我就得跳楼了。
      

  8.   

    因为你使用是<img src=""/>
    ie每次都会解释一遍这个标签,所以每次都得执行一次GetImage.aspx,所以每次都得执行pageload事件,这个和缓存没有关系,你可以这样做:
    你把数据库读取出来的字节存储到cache中;
     Cache.Insert("img", bit);
    然后再执行查询数据库之前先判断cache中是否有存在:
    object o=(object Cache .Get ("img");
    如果if(o==null)执行数据库查询操作,不为null直接Response.BinaryWrite应该能解决你的问题
      

  9.   

    <IMG src="GetImage.aspx?random=<%=new Random.Next(1000,9999)%>"> 原因:浏览器的缓存机制认为GetImage.aspx动态生成的图片为同一图片,因为他们的文件名都是 GetImage.aspx
    加入一个随机码,每次请求的文件浏览器认为不同,所以会重新请求服务器以获得最新的图片
      

  10.   

    注意,只修改上面 HTML code 中的代码
    其它的代码不需要改动,也不需要人为地去控制浏览器的 cache
      

  11.   

    Sorry,
    本人老了,看问题老看错。
      

  12.   

    楼主好心人
    原谅我这个老人的失误
    不过使用我的那个思路确实可以解决问题。
    简单的说下吧在图片的创建页面加入一个缓存命令,注意,一定要设置VaryByParam="random"
    <%@ OutputCache Duration="3600" VaryByParam="random" %> 接下来就是在test.aspx页面了
    使用JS去引入 GetImage.aspx, 这样方便附加 random 参数
    再放置一个 hidden textbox,用来保存 random 的值
    js代码如下var img = document.getElementById('img');
    var ran = document.get...('hiddenTextBox').value;window.onload = function() {
      img.src = 'GetImage.aspx?random='+ran;
    };
    后台页面:
    Page_Load() {
      if(IsPostBack) {
        hiddenTextBox.Value = new Random.Next(1000,9999); // 更新hiddenTextBox的值,使GetImage.aspx的缓存失效
      }
    }
      

  13.   

    <%@ OutputCache Duration="3600" VaryByParam="random" %> 
    你用的是页面缓存,必需在前面设置,如果是保存整个页面的话把VaryByParam="random"改成VaryByParam="*",不想用这种方式的话,你可以去看看petshop里的依赖缓存,用着不错
      

  14.   

    10楼的方案应该正解。因为你使用的是img标签,所以页面缓存不能解决你的问题。只能在getimage.aspx页面去控制图片内容缓存。
      

  15.   

    提供思路:
    将图片的地址数据放到数据库中。将你的集合放到HttpContext.Current.Cache对象里。不过需要一个KEY来关联。
    这个类继承了IEnumerable 接口
    以后每次取数据的时候,先到cache里去检查是否存在这个KEY的CACHE。有的话,让集合的值来源与CACHE比较好
    不过CACHE存放集合的例子比较少见。更多用于存放例如用户数据啊这些东西,因为集合是实时查询。所以CACHE一般不用再这里,而集合的缓存,目的是为了提高性能,其一:SQL语句优化。其二:利用数据库缓存,         /// <summary>
            /// 增加缓存
             /// </summary>
            /// <param name="key"></param>
            /// <param name="data"></param>
            protected static void CacheData(string key, object data)
            {
                if (data != null)
                {
                    HttpContext.Current.Cache.Insert(key, data, null,
                       DateTime.Now.AddMinutes(10), TimeSpan.Zero);
                }
            }        /// <summary>
            /// 删除缓存
             /// </summary>
            protected static void PurgeCacheItems(string prefix)
            {
                prefix = prefix.ToLower();
                List<string> itemsToRemove = new List<string>();            IDictionaryEnumerator enumerator = Cache.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    if (enumerator.Key.ToString().ToLower().StartsWith(prefix))
                        itemsToRemove.Add(enumerator.Key.ToString());
                }            foreach (string itemToRemove in itemsToRemove)
                    Cache.Remove(itemToRemove);
            }