asp.net вызывает WebMethod из Javascript асинхронно - PullRequest
3 голосов
/ 23 августа 2011

Я пытаюсь создать страницу asp.net (c #), которая обновляет некоторые тексты состояний каждую секунду. Теперь я реализовал кнопку, которая вызывает другой PageMethod, который перезапускает что-то и занимает немного времени. Проблема в том, что когда я вызываю перезапуск PageMethod, обновление PageMethod не может обновляться, пока продолжается метод перезапуска ...

Я написал небольшой пример, чтобы показать, что я имею в виду:

WebMethods на моей странице:

    [WebMethod]
    public static string Update()
    {
        //return "a" to see when the Update PageMethod succeeded
        return "a";
    }

    [WebMethod]
    public static string Restart()
    {
        //the restart will take a while
        Thread.Sleep(2000);
        //return "a" to see when the Restart PageMethod succeeded
        return "a";
    }

HTML-элементы для обновления:

<p id="update" style="float:left;"></p>
<p id="restart" style="float:right;"></p>

Pagemethod вызывает:

callUpdate()
            function callUpdate() {
                PageMethods.Update(function (text) {
                    //itself+text from pagemethod
                    $('#update').text($('#update').text() + text);
                });
                setTimeout(callUpdate, 1000);
            }

            callRestart()
            function callRestart() {
                PageMethods.Restart(function (text) {
                    //itself+text from pagemethod
                    $('#restart').text($('#restart').text() + text);
                });

                setTimeout(callRestart, 1000);
            }

Примечание. Обновление также вызывается каждую секунду после его завершения, просто чтобы посмотреть, как оно работает

Чтобы уточнить: я хочу, чтобы PageMethods выполнялся независимо от того, что другой PageMethod завершил.

Я также пролетал над некоторыми ссылками, такими как: http://esskar.wordpress.com/2009/06/30/implementing-iasyncresult-aka-namedpipeclientstream-beginconnect/

http://msdn.microsoft.com/en-us/library/aa480516.aspx

Но я не думаю, что это то, что мне нужно (?) И я действительно не знаю, как это вызвать из Javascript (BeginXXX и Endxxx)

* РЕДАКТИРОВАТЬ: *

Что касается Массимилиано Пелусо, код js будет выглядеть так:

        callUpdate()
        function callUpdate() {
            $.ajax({
                type: "POST",
                url: "ServicePage.aspx/Update",
                data: "{}",
                contentType:
                "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                    $('#update').text($('#update').text() + msg.d);
                }
            });
            setTimeout(callUpdate, 1000);
        }

        callRestart()
        function callRestart() {
            $.ajax({
                type: "POST",
                url: "ServicePage.aspx/Restart",
                data: "{}",
                contentType:
                "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                    $('#restart').text($('#restart').text() + msg.d);
                }
            });
            setTimeout(callRestart, 1000);
        }

Примечание: когда я запускаю страницу с новым js, возникает та же проблема, что и раньше: метод Update ничего не может сделать, пока метод Restart не будет завершен.

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

Вы должны вызывать методы страницы, используя вместо этого асинхронный вызов.

смотрите ниже.Это общий способ вызова метода страницы с использованием JQuery

$.ajax({
  type: "POST",
  url: "PageName.aspx/MethodName",
  data: "{}",
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  success: function(msg) {
    // Do something interesting here.
  }
});

. Этот код следует использовать для замены вызовов метода страницы

PageMethods.Restart(function (text))

PageMethods.Update(function (text))
2 голосов
/ 05 сентября 2011

Это потому, что запрос продолжается только тогда, когда другой запрос не обрабатывается.Это потому, что два процесса не могут получить доступ к одному и тому же SessionState (состояние сеанса не является потокобезопасным).

Таким образом, чтобы достичь того, что запросы обрабатываются одновременно, необходимо установить EnableSessionState в директиве @Page для 'ReadOnly' или 'false'

...