在我的MVC应用程序中,我每10秒使用重复的ajax调用。有时一段时间后,数据库服务器与应用程序服务器断开连接,然后在运行应用程序的浏览器中出现大量内存泄漏。
我的代码运行为,
我使用jquery.timer.js每10秒重复一次ajax调用
function class1() {
}
class1.prototype. funtion1 = function () {
$.ajax({
type: "POST",
url: "/TestContoller/ActionOne",
success: function (result) {
$('#DivActionOne').html(result);
},
traditional: true,
error: function (req, status, error) {
}
});
}
//Likewise for funtion2, funtion3, funtion4, funtion5
var count = 0;
var timer = $.timer(function () {
$('#counter').html(++count);
var class1 = new class1();
var funtionOne= class1.funtion1;
var funtionTwo= class1.funtion2;
var funtionThree= class1.funtion3;
var funtionFour= class1.funtion4;
var funtionFive= class1.funtion5;
var currentSec = count;
if ((currentSec % 10) == 0) {
funtionOne ();
funtionTwo ();
funtionThree ();
funtionFour ();
funtionFive ();
}
});
timer.set({ time: 1000, autostart: true });
当连接丢失时,我检查了跟踪日志并找到了以下错误消息:
消息:System.ServiceModel.CommunicationException:基础连接已关闭:服务器已关闭预期保持活动状态的连接。 ---> System.Net.WebException:底层连接已关闭:服务器已关闭预期保持活动状态的连接。 ---> System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭现有连接。 ---> System.Net.Sockets.SocketException:远程主机强制关闭现有连接 在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,Int32大小) ---内部异常堆栈跟踪结束--- 在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,Int32大小) 在System.Net.PooledStream.Read(Byte []缓冲区,Int32偏移量,Int32大小) 在System.Net.Connection.SyncRead(HttpWebRequest请求,布尔userRetrievedStream,布尔probeRead) ---内部异常堆栈跟踪结束--- 在System.Net.HttpWebRequest.GetResponse() at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) ---内部异常堆栈跟踪结束---
请帮我整理一下。
答案 0 :(得分:1)
因为您正在使用计时器而没有在之前的ajax调用回调函数上调用下一个ajax请求。除非您将Web服务器设置为像Web园一样(允许同时请求),否则您需要等到每个服务器完成后再转到下一个。
将ajax调用放入函数中,然后调用success
回调中的函数,使其在完成时再次运行。
当然你需要设置某种类型的变量来确定它是否完成,所以它不会无限循环。
除此之外,还需要服务器端优化。
这样的东西应该可行,当然没有原型,因为我从来没有使用过原型,但是这里没有它:
thecount = 0;
function class1() {
$.ajax({
type: "POST",
url: "/TestContoller/ActionOne",
success: function (result) {
$('#DivActionOne').html(result);
thecount++1;
if (thecount < 5) { class1(); }
},
traditional: true,
error: function (req, status, error) {
}
});
}