asp.net从Javascript asyncronous调用WebMethod

时间:2011-08-23 08:16:14

标签: c# jquery asp.net webmethod

我正在尝试构建一个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)中调用它

* 编辑:*

关于Massimiliano Peluso,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运行Page时,出现与以前完全相同的问题:Update方法在Restart方法完成之前无法执行任何操作。

2 个答案:

答案 0 :(得分:3)

您应该使用异步调用来调用页面方法。

看看下面的内容。这是使用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))

答案 1 :(得分:2)

这是因为请求仅在没有其他请求正在处理时继续进行。 那是因为两个进程无法访问相同的SessionState(Sessionstate不是Threadsafe)。

为了实现同时处理请求,您必须将@Page指令中的EnableSessionState设置为'ReadOnly''false'