jQuery对Web服务的Ajax调用似乎是同步的

时间:2012-01-29 10:14:19

标签: c# jquery asp.net ajax web-services

我有一个来自jquery的web服务的两个ajax调用。

第一个调用(GetMessages)在javascript(setInterval)中启动一个间隔,并返回存储在会话变量中的字符串数组。

第二次调用(UploadUsers)上传用户并将状态保存在方法GetMessages中以返回。因此,UploadUsers向Session添加消息,GetMessages检索消息并为客户端显示消息。

问题是即使我异步调用这两个方法,GetMessages等待UploadUsers完成。它只是加载。

我甚至在每个添加的用户之间添加了一个thread.sleep,我希望GetMessages返回“已添加1/10用户”,“已添加2/10个用户”,每个用户都有不同的通话

GetMessagesUploadUsers完成之前不会返回任何内容,然后立即显示所有文本。

我有很多代码,所以我不知道该放什么,但在这里:

UploadUsers.aspx

callAsynchMethod('ClientStatusHandler.asmx/GetMessages',
'', printMessages, stopPollingError);

callAsynchMethod('ClientStatusHandler.asmx/StartRetrievingLeads',
data, stopPolling, stopPollingError);

Site.js

function callAsynchMethod(url, keyValue, callBack, callBackError) {
    $.ajax({
        type: "POST",
        url: url,
        data: keyValue,
        contentType: "application/json; charset=utf-8",
        success: callBack,
        error:callBackError
    });
}

ClientStatusHandler.asmx.cs

const string key = "LUMessages";
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        [WebMethod(EnableSession = true)]
        public string[] GetMessages()
        {

            if (Session[key] != null)
            {
                string[] messages = ((IList<string>)Session[key]).ToArray();
                ((IList<string>)Session[key]).Clear();
                return messages;
            }
            return new string[] { };
        }







  [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
     [WebMethod(EnableSession = true)]
      public string[] UploadUsers()
     {
    //This function adds a user and calls SaveMessageToQueue 
//for every user.
    //I see the message being entered into the session and 
//I call Thread.Sleep(10000) 
    //between messages.
    }









     private void SaveMessageToQueue(string m)
        {

        IList<string> messageQueue = (List<string>)HttpContext.Current.
Session["LUMessages"];
        messageQueue.Add(m);
         }

1 个答案:

答案 0 :(得分:4)

这是因为您启用了Session和Session会锁定所有调用,直到它们返回。

您还可以阅读此问题:Replacing ASP.Net's session entirely

另请阅读:https://stackoverflow.com/a/3660837/159270