【问题标题】:How to implement super fast ASP.NET AJAX callbacks/PageMethods如何实现超快的 ASP.NET AJAX 回调/PageMethods
【发布时间】:2011-02-07 19:24:51
【问题描述】:

我正在设计一个 ASP.NET Web 应用程序 (.NET 4.0),它基本上有一个页面应该每 1-2 秒与后面的代码进行交互(使用客户端回调或通过 ScriptManager 或 jQuery.ajax 的 PageMethods)它会托管在 Intranet 上,因此 1-2 秒的刷新率是合理的。

  1. 我怎样才能让页面及时访问后面代码中的网络服务/页面方法(例如每 1 秒)。我应该使用javascript计时器(我对javascrip不太熟悉)吗?

  2. 虽然网站托管在 Intranet 上,但我仍然需要实施一种好的方法来达到所需的刷新率。每次交互传输的数据量约为 1KB。 您对我的设计有什么建议?(使用回调或 ScriptManager 或 jQuery.ajax,...我应该避免的任何陷阱)

谢谢。

【问题讨论】:

    标签: javascript asp.net ajax callback pagemethods


    【解决方案1】:

    使用任何一种方法,每 1-2 秒 1kb 的请求都是合理的。如果您正在处理快速网络/服务器,那么什么都不做的页面方法或 Web 服务(它们在底层几乎相同)将在几毫秒内做出响应。

    限制因素将是您的服务器端方法的主体需要多长时间才能完成(即,如果它涉及数据库或外部服务,这会比服务的开销更慢)。

    【讨论】:

    • 谢谢。在服务器端,我知道我的教训。我会在那里尽力而为。我有点担心的是客户端。 + 你对在页面上实现计时器有什么建议吗?
    • 您需要使用 JavaScript 的 setTimeout 来启动一个计时器,然后在每个响应返回后使用它来重新启动另一个计时器。例如,setTimeout(yourPollingFunction, 2000) 在两秒钟内呼叫yourPollingFunction。避免使用 setInterval 的诱惑。它有一些不明显的缺点:weblogs.asp.net/bleroy/archive/2009/05/14/…
    【解决方案2】:

    我使用 Web 服务,因为它们要快得多。但是如果你使用 UpdatePanels,Webservices 是没用的。另外我想说的是,您不应该每 x 秒更新一次页面,但首先要询问是否有更新要做。这节省了很多;-)

    这可能是一个小例子,我没有尝试过,但曾经这样工作过。是ms ajax版本,需要scriptmanager

    Type.registerNamespace("myproject");
    
    myproject.updateControl = function () {
        myproject.updateControl.initializeBase(this);
        this._xhr = null;
        this._updating = false;
        this._timer = null;
    }
    
    myproject.updateControl.prototype = {
        initialize: function () {
            myproject.updateControl.callBaseMethod(this, 'initialize');
            this.startTimer();
        },
        startTimer: function () {
            if (this._timer) clearTimeout(this._timer);
            this._timer = setInterval(Function.createDelegate(this, this._timerWork), 2000);
        },
        stopTimer: function () {
            clearTimeout(this._timer);
            this._timer = null;
        },
        _timerWork: function () {
            if (this._updating || !this._checkXhr()) return;
            this._xhr = Sys.Net.WebServiceProxy.invoke("myServicePath Or null if PageMethod", "checkForUpdate",
             false,
             null,
             Function.createDelegate(this, this._onCheckedUpdate));
    
        },
        _onCheckedUpdate: function (data) {
            this._xhr = null;
            if (data.needsUpdate) {
                this._update();
            }
        },
        _udpate: function () {
            if (!this._checkXhr) return;
            this._updating = true;
            this._xhr = Sys.Net.WebServiceProxy.invoke("servicepath", "updateMe", false, { param: param }, Function.createDelegate(this, this._updateSucces));
        },
        _updateSuccess: function (data) {
            alert("yeah i´m get updated");
            this._updating = false
            this._xhr = null;
    
        },
        _checkXhr: function () {
    
            if (this._xhr()) {
                if (confirm("There is an active call to the Server. If you wait to long, it may have been broken. Do you want to Abort the current call?")) {
                    this._xhr.get_executor().abort();
                    this._xhr = null;
                    return true;
                } else {
                    return false;
                }
            }
    
            return true;
    
        },
        dispose: function () {
            myproject.updateControl.callBaseMethod(this, 'dispose');
        }
    }
    
    myproject.updateControl.registerClass('myproject.updateControl', Sys.Component);
    

    用法

    $create(myproject.updateControl);
    

    var upd = new myproject.updateControl();
    upd.initialize();
    

    【讨论】:

    • 没有更新面板。大量不必要的数据将前后移动。像 Viewstate。这足以让我避免它。你对我的第一个问题有什么建议吗?
    【解决方案3】:

    客户端的“计时器”是个坏主意。您可以使用setInterval(method, timespan) 强制每 n 毫秒调用一次,但如果服务器得到备份,您可以开始堆叠请求,您将开始获得无序响应(即使在非慢速网络上)。

    我建议在调用处理逻辑中的 ajax 代码中使用 setTimeout(method, timespan) 来设置下一次调用。

    示例(使用 jQuery):

    function getStuff()
    {
      $.get(
        'myurl.aspx?r=' + Math.random(), // stop caching issues
        function(data) {
          $('#myDiv').html(data);
          setTimeout(getStuff, 2000); // you might want to set this to 1900 if you need it closer to every 2 seconds  
        }
      );
    }
    setTimeout(getStuff, 2000); // the initial timer initialization
    

    【讨论】:

    • 谢谢肖恩。我可能会以这种方式实现它。
    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    相关资源
    最近更新 更多