Автоматическая обратная передача ASP.Net. Что происходит, когда это слишком медленно? - PullRequest
1 голос
/ 14 ноября 2009

Я делаю веб-приложение. Я получил странную ошибку с панелями обновления.

Хорошо, скажем, у вас есть две панели обновлений, и на каждой панели обновлений есть текстовое поле. Оба эти текстовых поля имеют автоматическую обратную передачу, а панели обновления обновляются условно.

Что ж, из поведения, которое я наблюдаю, кажется, что если сервер обрабатывает запрос не быстрее, чем пользователь, то он как бы игнорируется на стороне клиента. Например, вы набираете что-то в одном из этих текстовых полей, а затем быстро переходите к следующему, набираете что-то и выходите. Это должно вызвать 2 сообщения обратно.

Ну, а что, если один пост обратно обрабатывается на сервере, а другой происходит? Отбрасывается ли этот пост обратно на стороне сервера или на стороне клиента?

Основная проблема, которую я наблюдаю в этой ситуации, заключается в том, что, когда пост возвращается в 1-й раз, существует обновление () для панели обновлений. Хорошо, когда 2-й пост возвращается, прерывая первый, он также выполняет Обновление на панели обновлений (другой). Пользователь видит, что если он очень быстро просматривает его (или сервер находится под высокой нагрузкой, или что-то еще), то обновляется вторая панель обновлений, но не первая.

tl; dr: Когда сообщение назад прерывает другой ответ назад, все панели обновления, которые должны были быть обновлены в первом ответе назад, не обновляются (хотя вторые сообщения обратной передачи)

Как я могу обойти эту проблему или решить ее? Я не могу обновить все панели обновления на экране, потому что тогда элемент управления, на котором находится пользователь, теряет фокус вместе с целым рядом другие проблемы.

Ответы [ 3 ]

3 голосов
/ 14 ноября 2009

UpdatePanels перехватить обратную передачу и отправить запрос обратно на сервер с помощью объекта XMLHTTPRequest (то есть они используют AJAX).

Второй запрос XMLHTTPRequest отменит первый, если он еще выполняется, когда создается второй. Насколько я знаю, это стандартное поведение.

Возможно, вы захотите, чтобы обновление UpdatePanels осуществлялось одновременно по нажатию кнопки, а не к тому, чтобы обновление было прикреплено к событию в каждом текстовом поле (похоже, что вы прикрепили их к событию blur). Таким образом вы можете убедиться, что многие запросы не выполняются, и, возможно, отключить кнопку во время выполнения запроса, чтобы новый запрос не отменял выполняемый запрос.

EDIT:

Вы можете предотвратить отправку другого запроса со стороны клиента, пока один запрос уже выполняется, проверив свойство PageRequestManager isInAsyncPostBack. Что-то вроде следующего

function pageLoad(sender, args) {

var pageManager = Sys.WebForms.PageRequestManager.getInstance();

// add a function to execute when an asynchronous postback is initialized
pageManager.add_initializeRequest(checkAsyncPostback);

} 

function checkAsyncPostback(sender, arg)
{
    var pageManager = Sys.WebForms.PageRequestManager.getInstance();
    // check if an async postback is already in progress
    if (pageManager.get_isInAsyncPostBack()) {
        // cancel this async postback if one is currently in progress
        arg.set_cancel(true);
    }
}

На самом деле не существует простого способа узнать со стороны сервера, прервана ли обратная передача.

0 голосов
/ 14 ноября 2009

Посмотрите на использование элемента управления UpdateProgress: http://www.asp.net/ajax/documentation/live/overview/UpdateProgressOverview.aspx

Кроме того, UpdatePanels излишни для такого рода вещей. Посмотрите на использование методов страницы (методы страницы Google ASP.NET)

РЕДАКТИРОВАТЬ: Чтобы уточнить, как это может быть полезно для вас, измените содержимое шаблона ProgressTemplate в элементе управления UpdateProgress, чтобы оно отображалось в модальном режиме, чтобы пользователи ничего не могли сделать до завершения запроса.

0 голосов
/ 14 ноября 2009

Я не могу ответить на ваши вопросы конкретно, потому что я не знаю, как страница управляет UpdatePanels и их запросами / ответами. Но вы, вероятно, очень легко сможете узнать, что происходит, если отследите вызовы с помощью Fiddler. Вы можете видеть, когда запросы запускаются, и вы можете видеть ответ, а также, если код ошибки HTTP отправляется обратно или генерируется исключение, и т. Д .:

Fiddler2

...