把数据存放到客户端
1. 适用数据的特点
海量,反复提取会影响网络带宽
稳定,很少改动
数据没有安全敏感性
2. 流程
A. 在页面中根据当前用户标识和最后一次修改的序列号,动态生成资源引用
<script src="/XXX/ClientData.axd?u=useid&n=123&t=pofoliu" type="text/javascript"></script>
其中u是用户ID,n是修改的序列号,t是要获取的数据类别
B. 在web.config中增加相应的URL请求映射
<httpHandlers>
<add verb="GET" path="ClientData.axd" type="Sample.ClientData" validate="false"/>
</httpHandlers>
C.数据库表支持
增加一张额外的表,只有两个字段,用户标识和修改序列号。
由于表数据很小,可以把这张表在系统启动时加载到内存中
用户修改数据库时,必须通知集群server中的所有机器来更新这张表。SQL2005提供了MQ机制,来通知server们,其它场景也应该没啥问题吧。
D.在 ClientData 类中,根据用户标识和类别,获取用户相应的数据
[AspNetHostingPermission(SecurityAction.LinkDemand, Level
=
AspNetHostingPermissionLevel.Minimal)]
public sealed class ClientData : IHttpHandler
{
void IHttpHandler.ProcessRequest(HttpContext context)
{
HttpResponse response1 = context.Response;
response1.Clear();
//根据QueryString来获取用户标识和数据类别
string text1 = context.Request.QueryString["u"];
text1 = ClientData.DecryptString(text1);//解码
..
//设置输出缓存的超时时间和内容类别
HttpCachePolicy policy1 = response1.Cache;
policy1.SetCacheability(HttpCacheability.Public);
//设置变化参数。如果不设置的话,每次请求ClientData.axd都会进来一次,缓存将不起作用。
//设置后,不同的参数值将取相应的缓存,只有缓存中不存在才会访问服务器
policy1.VaryByParams["u"] = true;
policy1.VaryByParams["n"] = true;
policy1.VaryByParams["t"] = true;
policy1.SetOmitVaryStar(true);
policy1.SetExpires(DateTime.Now.AddDays(20));
policy1.SetValidUntilExpires(true);
policy1.SetLastModified(DateTime.Now);
response1.ContentType = "application/x-javascript";
//把数据以压缩的方式输出
MemoryStream stream2 = null;
stream2 = new MemoryStream();
stream1 = new GZipStream(stream2, 1);
Stream stream3 = GetData(userid, type);//获取数据
byte[] buffer1 = new byte[0x400];
int num1 = 1;
while (num1 > 0)
{
num1 = stream3.Read(buffer1, 0, 0x400);
stream1.Write(buffer1, 0, num1);
}
byte[] buffer2 = stream2.ToArray();
response1.AddHeader("Content-encoding", "gzip");
response1.OutputStream.Write(buffer2, 0, buffer2.Length);
stream1.Close();
stream2.Close();
}
private static void Throw404()
{
throw new HttpException(0x194, AtlasWeb.ScriptResourceHandler_InvalidRequest);
}
}
public sealed class ClientData : IHttpHandler
{
void IHttpHandler.ProcessRequest(HttpContext context)
{
HttpResponse response1 = context.Response;
response1.Clear();
//根据QueryString来获取用户标识和数据类别
string text1 = context.Request.QueryString["u"];
text1 = ClientData.DecryptString(text1);//解码
..
//设置输出缓存的超时时间和内容类别
HttpCachePolicy policy1 = response1.Cache;
policy1.SetCacheability(HttpCacheability.Public);
//设置变化参数。如果不设置的话,每次请求ClientData.axd都会进来一次,缓存将不起作用。
//设置后,不同的参数值将取相应的缓存,只有缓存中不存在才会访问服务器
policy1.VaryByParams["u"] = true;
policy1.VaryByParams["n"] = true;
policy1.VaryByParams["t"] = true;
policy1.SetOmitVaryStar(true);
policy1.SetExpires(DateTime.Now.AddDays(20));
policy1.SetValidUntilExpires(true);
policy1.SetLastModified(DateTime.Now);
response1.ContentType = "application/x-javascript";
//把数据以压缩的方式输出
MemoryStream stream2 = null;
stream2 = new MemoryStream();
stream1 = new GZipStream(stream2, 1);
Stream stream3 = GetData(userid, type);//获取数据
byte[] buffer1 = new byte[0x400];
int num1 = 1;
while (num1 > 0)
{
num1 = stream3.Read(buffer1, 0, 0x400);
stream1.Write(buffer1, 0, num1);
}
byte[] buffer2 = stream2.ToArray();
response1.AddHeader("Content-encoding", "gzip");
response1.OutputStream.Write(buffer2, 0, buffer2.Length);
stream1.Close();
stream2.Close();
}
private static void Throw404()
{
throw new HttpException(0x194, AtlasWeb.ScriptResourceHandler_InvalidRequest);
}
}