这样是为了减少频繁访问服务器对其造成不必要的负担,但是同时也带来了一定特殊业务逻辑满足不了的问题。
例如:
  需要通过前台一个select下拉列表来作为ajax的触发入口,同时将server返回的信息呈现在页面,并且往session或者数据库里面更新一些实际的东西的逻辑操作。
当第一次切换选项,也就是提交请求的时候一切都是正常的,但是如果切换相同选项因为浏览器的缓存原因,将不会走到server,实际得到的动态信息是从缓存中去取的。造成后台的逻辑没有被走到。代码如下:
aspx相关代码
复制代码 代码如下:
<asp:DropDownList ID="ddlProductList" runat="server">
<asp:ListItem Value="" Selected="True"></asp:ListItem>
<asp:ListItem Value="null">積立利率変動型終身保険</asp:ListItem>
<asp:ListItem Value="QIWL">  "KIWL">  "JIWL">  "null">積立利率変動型終身保険(市場金利連動型)</asp:ListItem>
<asp:ListItem Value="IIWL">  "HIWL">  "null">積立利率変動型終身保険(貯蓄重視型)</asp:ListItem>
<asp:ListItem Value="KIWLS">  "null">ドル建積立利率変動型終身保険</asp:ListItem>
<asp:ListItem Value="ODIWL">  "JDIWL">  "HDIWL">  "null"> 積立利率変動型養老保険(貯蓄重視型 米ドル建) </asp:ListItem>
<asp:ListItem Value="JDISE">  "codetitle">复制代码 代码如下:
if (!IsPostBack)
{
//为doropdownlist添加客户端事件
ddlProductList.Attributes.Add("onchange", "selectChange(this)");
}

Ajax.js代码
复制代码 代码如下:
var request;
function selectChange(obj) {
createHttpRequest();
var url = "AjaxService.aspx?product=" + obj.value;
request.open("GET",url,true)
request.onreadystatechange = resetRate;
request.send();
return false;
}
function createHttpRequest () {
if (window.ActiveXObject) {
request = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
}
}
function resetRate() {
if (request.readyState == 4) {
if (request.responseText.substring(0,1) == "#") {
document.getElementById("systemErrorMsg").innerHTML = request.responseText.substring(1);
document.getElementById("rate").innerHTML = "";
} else {
document.getElementById("rate").innerHTML = request.responseText;
document.getElementById("systemErrorMsg").innerHTML = "";
}
}
}

请求页面代码
复制代码 代码如下:
protected void Page_Load(object sender, EventArgs e)
{
string productShortName = Request.QueryString["product"];
if (productShortName != null && productShortName != "null" )
{
string result = Utility.GetProductRate(packageName);
Session["rate"] = result;
Response.Write(result);
}
}

经过分析问题出在XmlHttpRequest这个对象上面,切换选项后,并不是每次走到请求页面的逻辑中。查询了相关资料解决方案如下:
request.setRequestHeader("If-Modified-Since","0");
简单的说,Last-Modified 与If-Modified-Since 都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头,可 以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。
另外还有另一个解决放案,不过还未经测试,理论上应该是可行的,就是在请求页面设置一下response的header:
Response.AddHeader("Cache-control", "no-cache");
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。