Как реализовать супер быстрые обратные вызовы ASP.NET AJAX / PageMethods - PullRequest
1 голос
/ 07 февраля 2011

Я разрабатываю веб-приложение ASP.NET (.NET 4.0), которое в основном имеет страницу, которая должна взаимодействовать с кодом каждые 1-2 секунды (с помощью обратных вызовов клиента или методов PageMethods через ScriptManager или jQuery.ajax).быть размещенным в интранете, так что частота обновления 1-2 секунды является разумной.

  1. Как я могу заставить страницу своевременно обращаться к веб-службе / методу страницы в коде (например, каждую 1 секунду).Должен ли я использовать таймер JavaScript (я не очень знаком с Javascrip)?

  2. Хотя сайт размещен в интрасети, но мне все еще нужно реализовать хороший подход для достижения желаемой частоты обновления.объем передаваемых данных составляет около 1 КБ в каждом взаимодействии. Каковы ваши рекомендации относительно моего дизайна относительно этого? (с использованием обратных вызовов или ScriptManager или jQuery.ajax, ... любых ловушек, которых я должен избегать)

Спасибо.

Ответы [ 3 ]

2 голосов
/ 07 февраля 2011

Запрос 1кб каждые 1-2 секунды является разумным с использованием любого подхода.Метод страницы или веб-служба (они практически идентичны), которые ничего не делают, будут реагировать всего за несколько миллисекунд, если вы работаете с быстрой сетью / сервером.долго выполнение вашего метода на стороне сервера (например, если он связан с базой данных или внешней службой, это замедлит вас больше, чем издержки службы).

1 голос
/ 07 февраля 2011

«Таймер» на стороне клиента - плохая идея.Вы можете использовать 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
1 голос
/ 07 февраля 2011

Я пользуюсь веб-сервисами, так как они намного быстрее. Но если вы делаете с UpdatePanels, веб-сервисы бесполезны. Кроме того, я бы сказал, что вы не должны обновлять страницу каждые х секунд, но сначала спросите, есть ли обновление, которое нужно сделать вообще. Это сильно экономит; -)

Это может быть небольшой пример, я не пробовал, но работал один раз, как это. Это MS AJAX версия, требуется скриптменеджер

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();
...