0

在我的 MVC 应用程序中,我每 10 秒使用重复的 ajax 调用。有时,经过一段时间后,数据库服务器与应用程序服务器断开连接,然后在运行应用程序的浏览器中出现巨大的内存泄漏。

我的代码运行为,

我每 10 秒使用 jquery.timer.js 进行重复的 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: Unable to read data from the transport connection: 一个现有的连接被远程主机强行关闭。---> System.Net.Sockets.SocketException: 远程主机在 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 处强制关闭现有连接 --- End of inner异常堆栈跟踪 --- 在 System.Net.Sockets.NetworkStream.Read(Byte[] 缓冲区,Int32 偏移量,Int32 大小) 在 System.Net.PooledStream.Read(Byte[] 缓冲区,Int32 偏移量,

请帮我解决这个问题。

4

1 回答 1

1

因为您使用的是计时器,而不是在上一个 ajax 调用回调函数上调用下一个 ajax 请求。除非您将网络服务器设置为像网络花园一样对待(允许同时请求),否则您需要等到每个服务器都完成后才能进入下一个服务器。

将您的 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) {
            }
        });            
    }
于 2012-06-27T05:36:54.727 回答