1

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

  1. 如何使页面以一种及时的方式(例如每 1 秒)在后面的代码中访问 Web 服务/页面方法。我应该使用javascript计时器(我对javascrip不太熟悉)吗?

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

谢谢。

4

3 回答 3

2

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

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

于 2011-02-07T19:32:32.307 回答
1

我使用 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();
于 2011-02-07T19:34:05.033 回答
1

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

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

示例(使用 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
于 2011-02-07T20:00:26.707 回答