我有一个页面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的代码?为什么
在另外一个页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的代码?为什么
页或用户控件进行缓存的时间(以秒计)。在页或用户控件上设置该属性为来自对象的 HTTP 响应建立了一个过期策略,并将自动缓存页或用户控件输出。
注意 该属性是必需的。如果未包含该属性,将出现分析器错误。 VaryByParam
分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用 GET 方法属性发送的查询字符串值对应,或与用 POST 方法发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括 none、* 和任何有效的查询字符串或 POST 参数名称。
警告 在输出缓存 ASP.NET 页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的 @ OutputCache 指令中包含了 VaryByControl 属性。如果没有包含它,则发生分析器错误。如果您不想使缓存内容随任何指定参数发生变化,请将该值设为 none。如果要使输出缓存根据所有参数值发生变化,请将属性设置为 *。
那个顶部?GetImage.aspx的页面顶部?我用Response.write("<%@ OutputCache Duration="3600" VaryByParam="None" %> ")可以么?
可是不行啊。我这里还是每次调用这个页面都执行C#代码。
错那里了呢?
如果不行只能把整个页面代码都用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();
{
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中的代码。
好像页面根本没有缓存。为什么?
不行我就得跳楼了。
ie每次都会解释一遍这个标签,所以每次都得执行一次GetImage.aspx,所以每次都得执行pageload事件,这个和缓存没有关系,你可以这样做:
你把数据库读取出来的字节存储到cache中;
Cache.Insert("img", bit);
然后再执行查询数据库之前先判断cache中是否有存在:
object o=(object Cache .Get ("img");
如果if(o==null)执行数据库查询操作,不为null直接Response.BinaryWrite应该能解决你的问题
加入一个随机码,每次请求的文件浏览器认为不同,所以会重新请求服务器以获得最新的图片
其它的代码不需要改动,也不需要人为地去控制浏览器的 cache
本人老了,看问题老看错。
原谅我这个老人的失误
不过使用我的那个思路确实可以解决问题。
简单的说下吧在图片的创建页面加入一个缓存命令,注意,一定要设置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的缓存失效
}
}
你用的是页面缓存,必需在前面设置,如果是保存整个页面的话把VaryByParam="random"改成VaryByParam="*",不想用这种方式的话,你可以去看看petshop里的依赖缓存,用着不错
将图片的地址数据放到数据库中。将你的集合放到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);
}