Почему вся моя страница перезагружается в Chrome и Firefox при использовании асинхронных обратных передач UpdatePanel? - PullRequest
1 голос
/ 03 апреля 2010

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

Я разработал веб-сайт с поддержкой AJAX, который отлично работает в IE, Chrome и Firefox в течение года или около того. Я использую таймер для проверки входящих сообщений каждые 30 секунд, и это обновляет панель обновления, отображающую потенциальные новые сообщения.

Теперь несколько пользователей из Firefox жалуются на то, что страница обновляется каждые 30 секунд! Я сам не могу воспроизвести это поведение, но, учитывая описание «30 секунд», я проклял свое решение Таймера как виновника.

Но сейчас я сам сталкиваюсь с этой ошибкой, но не в Firefox, а в Google Chrome! (И только на одном из двух моих компьютеров!) Каждые 30 секунд страница перезагружается! Но я обнаружил, что это относится не только к таймеру, потому что все другие асинхронные обратные передачи на сервер в UpdatePanels также перезагружают всю страницу.

Эта ошибка никогда не возникала в Internet Explorer (насколько мне известно).

Как я уже сказал, это относится не только к обратной передаче по таймеру, но и, если кому-то это интересно, код такой:

<asp:Timer runat="server" ID="MailCheckTimer" Interval="30000" OnTick="MailChecker_Tick"></asp:Timer>

<asp:UpdatePanel runat="server" ID="MailCheckerUpdatePanel" UpdateMode="Conditional">
    <ContentTemplate>
         <div class="newmail_box" runat="server" id="newmail_box">
           <!-- Content stripped for this example -->
         </div>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="MailCheckTimer" />
    </Triggers>
</asp:UpdatePanel>

В других местах сайта я вызываю клиентскую функцию __doPostBack напрямую из JavaScript по отношению к UpdatePanel. Обычным поведением для этого вызова является обновление ссылочной UpdatePanel некоторым содержимым, но теперь в Chrome это обновляет всю страницу! (но опять же не последовательно и никогда в IE)

Даже самые основные операции UpdatePanel, такие как обновление содержимого после нажатия кнопки (внутри панели), вынуждают страницу полностью перезагрузиться:

<asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click"></asp:Button>

И чтобы еще больше меня мучить, я испытываю это только на своем общедоступном веб-сайте, а не в своей локальной среде разработки, что делает утомительным делом поиск истинной причины для меня! (

Есть идеи, почему это происходит? Почему так непоследовательно? Это связано с моим UpdatePanel-дизайном? Или какие-то настройки безопасности в Firefox / Chrome, которые предотвращают некоторые асинхронные обратные вызовы UpdatePanel?

Любая помощь или идея высоко ценится!

1 Ответ

2 голосов
/ 08 апреля 2010

OK. Я починил это. Для того, что это стоит для любых будущих читателей затычка волос, вот что я прошел:

Я прочитал статью на http://blogs.visoftinc.com/archive/2007/09/23/asp.net-ajax-updatepanel-not-working-common-problems.aspx, предложенную TenaciousImpy. Интересно, что мне показалось, что я попытался установить для атрибута xhtmlConformance значение Transistional без какого-либо эффекта. Я также попытался проверить свой контент с помощью превосходной службы XHTML Validator Service по адресу validator.w3.org, и, несмотря на то, что было неплохо привести мой HTML в форму, это не решило мою проблему. Я все еще мог воспроизвести ошибку в Chrome, то есть каждый пост обновлял всю страницу ...: (

А потом по чистой случайности (и не так ли случайно мы замечаем причину самых раздражающих ошибок?) Я заметил, что моя логика авторизации была вызвана на пост, который не предполагал что-либо делать как это. Да! ... Наконец, подсказка, которая должна быстро помочь мне определить причину моей алопеции.

Сокращение в погоне здесь, это показывает, что, Google Chrome и Firefox, когда настроено запоминать регистрационную информацию для определенного веб-сайта, отправляют эту информацию с каждым постом обратно . Обычно я отправляю их на сервер и проверяю их следующим образом:

string usern = Request["loginusername"] as string;
string password = Request["loginpassword"] as string;

if (!String.IsNullOrEmpty(usern) && !String.IsNullOrEmpty(password))
{
        Authenticate(usern, password, Request["rememberme"] != null);
}

Что ж, я проверил эти параметры в начале своей MasterPage, и если они существовали, я предположил, что пользователь отправил запрос на вход в систему. Я аутентифицировал пользователя и для простоты программирования перенаправил его на ту же страницу пользователя (т. Е. Обновил страницу в зарегистрированном формате и удалил элементы управления входом в систему).

Ergo my Timer с галочкой каждые 30 секунд расширяет параметры обратного вызова в соответствии с настройками входа пользователя, когда Chrome или Firefox запоминают ваш последний логин и пароль.

Решение было в дальнейшем простым и очевидным. Теперь я называю свою логику аутентификации только для анонимных пользователей:

if ( Session["user"] == null ) // Check parameter indicating a logged in user
{
      string usern = Request["loginusername"] as string;
      string password = Request["loginpassword"] as string;

      if (!String.IsNullOrEmpty(usern) && !String.IsNullOrEmpty(password))
      {
         Authenticate(usern, password);
      }
}

Это позволяет моему сайту поддерживать память настроек входа в Chrome и Firefox.

...