Асинхронные веб-методы - PullRequest
4 голосов
/ 09 июня 2011

У меня есть клиент / служба.

У службы есть метод, который занимает много времени (он взаимодействует с базой данных).

Я вызываю этот метод черезAJAX-запрос со страницы к клиенту, затем к сервису и обратно.

Мой сервисный код:

[WebMethod]
public static string LookupUPC(string sessionId, string upc) {
    string response = "";
    var client = new SmartShopService.SmartShopInterfaceClient();
    try {
        response = client.LookupUPC(sessionId, upc);
    }
    catch (Exception e) {
        throw e;
    }
    finally {
        if (client.State == System.ServiceModel.CommunicationState.Faulted)
            client.Abort();
        else
            client.Close();
    }
    return response;
}

Вызывается со страницы запросом AJAX

for(var i = 0;i<10; i++){
$.ajax({
    type: "POST",
    url: "SmartShopGUI.aspx/LookupUPC",
    contentType: "application/json; charset=utf-8",
    data: DataCreator(allData),
    dataType: "json",
    success: function (result) {
        $(upcName).html(result.d);      
    },
    error: AjaxFailed
});
}

Теперь это делается асинхронно на странице, но клиент отправляет запросы синхронно.Я хочу изменить это так, чтобы, если он запрашивает 10 сразу, он отправит 10 различных запросов в службу.

http://www.screencast -o-matic.com / watch / cX1Qo8qV2

Вот видео, которое может помочь.

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Снимите зависимость от сеанса в веб-методе, вы, вероятно, обнаружите, что доступ к сеансу является последовательным, и это то, чем является блок.

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

Параллельные запросыи Состояние сеанса

Доступ к состоянию сеанса ASP.NET является исключительным для каждого сеанса, что означает, что, если два разных пользователя делают параллельные запросы, доступ к каждому отдельному сеансу предоставляется одновременно.Однако, если два одновременных запроса сделаны для одного и того же сеанса (с использованием одного и того же значения SessionID), первый запрос получает эксклюзивный доступ к информации сеанса.Второй запрос выполняется только после того, как первый запрос завершен.(Второй сеанс также может получить доступ, если исключительная блокировка информации освобождается, поскольку первый запрос превышает время ожидания блокировки.) Если значение EnableSessionState в директиве @ Page установлено в ReadOnly, запрос только для чтения.Информация о сеансе не приводит к исключительной блокировке данных сеанса.Однако запросы только для чтения для данных сеанса, возможно, все еще должны ждать блокировки, установленной запросом чтения-записи, для очистки данных сеанса.

1 голос
/ 09 июня 2011

Лучше создать API BatchLookup, который может обрабатывать блок запросов за один раз.Любое соединение между браузером и сервером будет ограничено в отношении того, сколько одновременных запросов вы можете сделать, и каждое обратное путешествие является самой медленной операцией.

Я подозреваю, что это не на стороне серверапроблема вообще, кроме ограничения подключения к браузеру, которое вы используете. Даже если вы исправите серверную часть для обработки двух одновременных запросов, браузер не будет запускать все 10 из них одновременно.См., Например, эту статью на тему: http://www.ajaxperformance.com/2006/12/18/circumventing-browser-connection-limits-for-fun-and-profit/

Кстати, как же поиск одного кода UPC в базе данных может занять так много времени?Вы правильно его проиндексировали?

...