c# - from - Las llamadas jQuery Ajax al servicio web parecen ser síncronas
web service ajax jquery (1)
Esto se debe a que tiene habilitada la sesión y la sesión bloquea todas las llamadas hasta que regresen.
También puede leer esta pregunta: Reemplazar la sesión de ASP.Net por completo
también lea: https://stackoverflow.com/a/3660837/159270
Tengo dos llamadas ajax a un servicio web de jquery.
La primera llamada ( GetMessages
) inicia un intervalo en javascript ( setInterval
) y devuelve una matriz de cadena de mensajes almacenados en una variable de sesión.
La segunda llamada ( UploadUsers
) carga usuarios y guarda el estado en la sesión que se devolverá en el método GetMessages
. Entonces UploadUsers agrega mensajes a la sesión y GetMessages recupera los mensajes y los muestra para el cliente.
El problema es que aunque llamo a ambos métodos de forma asincrónica, GetMessages
espera hasta que UploadUsers
finalice. Simplemente carga.
Incluso puse un thread.sleep entre cada usuario que se agrega y espero que GetMessages
devuelva "1/10 usuarios se han agregado", "se han agregado 2/10 usuarios", cada uno en llamadas separadas.
Lo que sucede es que GetMessages
no devuelve nada hasta que UploadUsers
finaliza y luego trae todo el texto a la vez.
Tengo un montón de código, así que no sé qué poner, pero aquí va:
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);
}