У меня есть веб-приложение, содержащее страницу с формой, на которой есть сотни полей. Изменение любого из полей вызывает вызов jQuery $.ajax на сервер, чтобы определить, нужно ли добавлять другие формы в форму на основе нового значения. Другими словами, он проверяет, нужно ли добавлять какие-либо зависимые поля в форму при изменении одного поля.
В этом процессе есть немного сложности, и в результате иногда эти проверки могут занять несколько секунд.
Проблема в том, что если одно поле находится в середине своего вызова $.ajax, и я пытаюсь изменить другое поле, ожидая завершения первого, пользовательский интерфейс блокируется, и я ничего не могу сделать на до завершения первого вызова. Он, как пользовательский интерфейс, может обрабатывать только один вызов $.ajax за раз. Здесь копия вызова $.ajax:
$.ajax({
type: "POST",
async: true,
url: serviceUrl,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json",
processdata: true,
success: serviceSuccess,
error: serviceFailed
});
Обратный вызов serviceSuccess
имеет много сложного кода для обновления пользовательского интерфейса, но я удалил ВСЕ код внутри него, и проблема все еще возникает. Я полагал, что это не связано с обратным вызовом, поскольку, похоже, это происходит до завершения вызова, но, чтобы быть уверенным, я дал ему шанс.
Кто-нибудь слышал о чем-то подобном ранее с jQuery $.ajax?
EDIT: Я заметил, что размер ответа, возвращаемого из вызова $.ajax, составляет около 130 тыс.
Изменить 2:. Запросы $.ajax вызывают вызовы для службы WCF. Определение класса теперь выглядит следующим образом:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ReviewDataService : IReviewDataService, IReadOnlySessionState
РЕШЕНИЕ: Итак, Джейсон определенно указал мне в правильном направлении. Моя проблема была, по сути, связана с блокировкой сеанса ASP.NET. Чтобы обойти это, мне пришлось исключить использование сеанса из любой точки стека вызовов при вызовах, которые возникли из моей службы WCF. Кроме того, я установил AspNetCompatibilityRequirementsMode в AspNetCompatibilityRequirementsMode.NotAllowed, и я установил aspNetCompatibilityEnabled = "false" в элементе serviceHostingEnvironment в web.config.
Это заставило WCF выкидывать ошибки, когда была предпринята попытка доступа к сессиям, и я juts реорганизовал каждый из этих экземпляров, чтобы они не полагались на сеанс. После этого мои вызовы WCF запускались одновременно, а не синхронно.