之前遇到一个问题。
于是做了以下实验:
页面加载后,提交一个Ajax请求(暂称为ajax1),请求的线程在服务器上被睡眠10秒钟。
点击页面上一个button,触发另一个Ajax请求(ajax2)。当没有使用session,在服务器未处理完ajax1的请求时,服务器依然可以处理ajax2的请求。
但是,当使用了session,在服务器未处理完ajax1的请求时,服务器不能处理ajax2的请求。必须等到ajax1处理完成后,才能处理ajax2的请求。使用session的代码很简单,Session.Add("user", "aaa");求教牛人,如何在使用了session后,当ajax1未处理完成时,依然可以处理ajax2的请求?
于是做了以下实验:
页面加载后,提交一个Ajax请求(暂称为ajax1),请求的线程在服务器上被睡眠10秒钟。
点击页面上一个button,触发另一个Ajax请求(ajax2)。当没有使用session,在服务器未处理完ajax1的请求时,服务器依然可以处理ajax2的请求。
但是,当使用了session,在服务器未处理完ajax1的请求时,服务器不能处理ajax2的请求。必须等到ajax1处理完成后,才能处理ajax2的请求。使用session的代码很简单,Session.Add("user", "aaa");求教牛人,如何在使用了session后,当ajax1未处理完成时,依然可以处理ajax2的请求?
解决方案 »
- 关于asp.net应用程序的问题?
- App_Code文件夹里面的类文件为什么不能调用Server.Mappath?
- 在文本框中的密码如何保持?
- 怎么读取修改过后dropdownlist控件的值??
- 水晶报表的图表显示问题
- asp.net中的datalist控件中怎样才能根据数据库中每条不同记录的imageURL显示不同的图片?
- 我用Server.Transfer来做两个页面之间传值,我怎么让页面成为新窗口打开呀,100分
- ASP.NET 小问题??????
- 微软专家请进,超难问题!
- 绝对路径怎样转化成相对路径?
- c# asp.net 全局变量总是被初始化怎么办?
- vs2008 treeview如何使用?
ajax不是发送的异步请求吗?
为什么,使用了session后,就变成同步的了?
http://www.zainanbao.com
protected void Page_Load(object sender, EventArgs e)
{
//使用session的代码
Session.Add("user", "aaa");
switch (Request.QueryString["action"])
{
case "ajax1":
Thread.Sleep(8000);
Response.Clear();
Response.Write("alert('ajax1');");
Response.End();
break;
case "ajax2":
Response.Clear();
Response.Write("alert('ajax2');");
Response.End();
break;
}
}
这是处理两个ajax请求的代码。
开始,我也怀疑这种情况。
然后,我将Session.Add("user", "aaa")代码片段,放置另一个页面(Login.aspx)中,然后再跳转到测试页面(Default.aspx)。
代码如下: protected void Button1_Click(object sender, EventArgs e)
{
Session.Add("user", "aaa"); Response.Redirect("Default.aspx");
}Default.aspx是处理两个ajax请求的页面。
这样,两个ajax请求,不再访问session代码了。
但是,一样会出现我所叙述的问题。
function myXmlHttp(){}myXmlHttp.prototype.sendXmlHttp=
function(url,data,fun){
var xmlHttp; if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
} xmlHttp.open("POST", url, true); xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
if (xmlHttp.responsetext != "") {
if(fun !=""&&fun !=undefined)
{
fun(xmlHttp.responsetext);
}
}
}
}
};
xmlHttp.send(data); }
回复楼上,我发送的是异步请求。
this.xmlhttp.onreadystatechange = function(){Ajax.handleStateChange(objxml)};
Ajax.handleStateChange = function (objxmlhttp)
{
var xmlhttpstatus = "";
if(objxmlhttp.readyState == 1)
{
xmlhttpstatus = "连接服务器";
}
else if(objxmlhttp.readyState == 2)
{
xmlhttpstatus = "开始加载数据";
}
else if(objxmlhttp.readyState == 3)
{
xmlhttpstatus = "正在加载数据";
}
else if(objxmlhttp.readyState == 4)
{
if(objxmlhttp.status == 200)
{
xmlhttpstatus = "加载完成";
}
}
else
{
xmlhttpstatus = "错误"+objxmlhttp.statusText;
}
}看看状态
在使用session后,ajax1未处理完前,也就是说ajax1状态为1时,ajax2请求的状态一直为1.
当ajax1为2时,ajax2状态才开始2-3-4顺序变化,ajax2状态为4时,ajax1开始3-4。
未使用session时,ajax1是否处理完,对ajax2没有影响。
就剩这个没法了。
function ajax1()
{
var xmlHttp = new myXmlHttp();
var doJS = function (jsString)
{
eval(jsString);
initConnection();
}
xmlHttp.sendXmlHttp('Default.aspx?action=ajax1','',doJS);
}
function ajax2()
{
var xmlHttp = new myXmlHttp();
var doJs = function(jsString){
eval(jsString);
}
xmlHttp.sendXmlHttp('Default.aspx?action=ajax2','',doJs);
}
<body onload="ajax1()">
<input value="ajax2" type="button" onclick="ajax2();" />
就剩这个没发了。 function ajax1()
{
var xmlHttp = new myXmlHttp();
var doJS = function (jsString)
{
eval(jsString);
ajax1();
}
xmlHttp.sendXmlHttp('Default.aspx?action=ajax1','',doJS);
}
function ajax2()
{
var xmlHttp = new myXmlHttp();
var doJs = function(jsString){
eval(jsString);
}
xmlHttp.sendXmlHttp('Default.aspx?action=ajax2','',doJs);
}<body onload="ajax1()">
<input value="ajax2" type="button" onclick="ajax2();" />
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
if (xmlHttp.responsetext != "") {
if(fun !=""&&fun !=undefined)
{
fun(xmlHttp.responsetext);
}
}
}
}
};
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(data);先把位置改成这样在doJS 这个函数中,把返回值alert 一下然后运行 看看效果
XMLHttpRequest请求对象的状态
还是根据Session["user"]的值来判断XMLHttpRequest请求的响应?
你没有看明白我的意思吧,我想我已经描述的比较清楚了。
Session["user"]的值,跟任何东西没有直接关系。
只是在使用Session后,ajax并发异步请求效果不一样。我要实现的是:
求教牛人,如何在使用了session后,当ajax1未处理完成时,依然可以处理ajax2的请求?
还有,不使用session的时候,是不会堵塞的。这个你有试过么?
Response.Write("alert('ajax1');");
Response.Write("alert('ajax2');");
ajax1和ajax2的请求得到处理后,都会返回aler的js代码提示。当不使用session时,点击Button触发ajax2,会立即alert("ajax2")
而,当使用session时,点击Button触发ajax2,不会立即alert("ajax2")。只有等到延迟结束先alert("ajax1")后,才会alert("ajax2")。
ajax异步请求, 指的是 不用等待请求的回应 可以继续操作,就是异步的发送请求。
这话是对的。
是我刚才:"ajax异步请求,在服务器处理时不是多线程? "这话说的不准确。
其实,我想说的是,无论同步还是异步请求,服务器每处理一个请求,都会分配一个线程。
ajax1和ajax2是两个请求,也就是两条不同的线程。
就是不使用session时啊,会立刻返回alert("ajax2");
说明,注释掉session,就不会导致阻塞。
你没有试吗?
所以,意义肯定是有的。
要不是那样的话,网站就全部乱套了,其实就是程序加锁了,必须把锁释放才能进行下一步操作,我建议楼主用其它技术来代替session,比如cache,application,Cookies等
但是,有个问题。
我这里,就是登陆时,使用了session,ajax1和ajax2两个请求,都没有使用session,按道理,这两个请求不涉及session才对呀。
能否贴出你的ajax,以及后台代码?
不然,application不早乱了。所以,我继续等待解决方案。
不用session会很痛苦的。
protected void Page_Load(object sender, EventArgs e)
{
//使用session的代码
Session.Add("user", "aaa");
switch (Request.QueryString["action"])
{
case "ajax1":
Thread.Sleep(8000);
Response.Clear();
Response.Write("alert('ajax1');");
Response.End();
break;
case "ajax2":
Response.Clear();
Response.Write("alert('ajax2');");
Response.End();
break;
}
}
就用你的代码就可以
你把分别把线程和session注释,调试 看看是怎么回事
另外,我不明白,注释Thread.sleep干嘛?其他看到的朋友,帮我也测试一下。到底是我测试出错,还是Sandy945的?
你现在的处理是同severlet的处理.thread的sleep有可能睡死了serverlet.导致serverlet不能异步.
尝试放在不同的serverlet处理看看.
终于按53楼,加一个EnableSessionState="ReadOnly" 搞定。顶!