Событие DataRepeater _ItemCommand прекращает работу через некоторое время - PullRequest
0 голосов
/ 08 февраля 2012

Хорошо, это самая странная вещь, которую я видел за последнее время ...

Я использую VS studio 2010 для создания веб-сайта asp.net (framework 4.0). Мой код находится на VB.Net. Мой тестовый браузер - Firefox (последняя версия), также протестированный на IE8 и Google Chrome, такое же поведение.

В основном у меня есть LinkButton в DataRepeater в UpdatePanel. Событие _ItemCommand ОГНЕТСЯ, пока я регулярно пользуюсь страницей (каждые несколько минут или около того).

Проблема заключается в следующем: когда я открываю другую веб-страницу (в другой вкладке браузера) и просматриваю ее примерно 1 час или около того, а затем возвращаюсь на тестовую страницу во вкладке браузера и нажимаю кнопку LinkButton, событие не запускается и страница получает перезагрузку. Как будто кнопка только что умерла от меня.

Сначала я решил, что это может быть проблема Session TimeOut, но я зарегистрировал SessionID в текстовом файле, и сессия НЕ истекает. <<<< Использование нового метода для обнаружения TimeOut </p>

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

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

Мой репитер ViewState включен. Я попытался изменить LinkButton для кнопки, но без радости та же проблема. Я попытался поднять AsyncPostBackTimeout ScryptManager ... тоже не радует. Я пробовал sessionState mode = "StateServer". Я попытался отключить AVG Link Scanner.

Так что ПОЖАЛУЙСТА, любая идея ... Не стесняйтесь, на данный момент я готов рассмотреть все.


Вот код, который я сейчас использую, чтобы проверить время ожидания сеанса:

If Context.Session IsNot Nothing And Context.Session.IsNewSession _
    And Page.Request.Headers("Cookie") IsNot Nothing _
    And Page.Request.Headers("Cookie").IndexOf("ASP.NET_SessionId") >= 0 Then

    'SESSION HAS TIMEDOUT
End If

ЗДЕСЬ МАРШРУТ СТРАНИЦЫ

<asp:UpdatePanel ID="udpRSSFeeds" runat="server" UpdateMode="Conditional">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="cmdSearch" EventName="Click" />
        <asp:AsyncPostBackTrigger ControlID="drpNewsFeed" EventName="ItemCommand" />
        <asp:AsyncPostBackTrigger ControlID="cmdViewAll" EventName="Click" />
    </Triggers>
    <ContentTemplate>

        <table class="Borderless" cellpadding="0" cellspacing="0"  style="width:100%">
        <tr><td class="lblHeaderText">NEWS FEEDS</td></tr>

        <%--BEGIN: SEARCH GIZMO--%>
        <tr><td>
            <table class="Borderless" style="width:100%;" cellpadding="0" cellspacing="0">
                <tr>
                    <td style="text-align:right; vertical-align:middle; height:32px;" >
                        <asp:TextBox ID="tbxSearchBox" runat="server" MaxLength="50" AutoCompleteType="None" Font-Size="16px" style="height:20px; width:187px; font-size:16px; border-style:solid; border-color:#54d242;" onfocus="Javascript:this.focus();this.select();" ></asp:TextBox>
                    </td>
                    <td style="text-align:left; vertical-align:middle; width:150px; height:32px;" >
                        <asp:ImageButton ID="cmdSearch" ImageUrl="~/GUIImages/cmdSearch.jpg" ToolTip="Search feed(s) for keyword(s)." Height="26px" Width="26px" runat="server" BorderStyle="None" ImageAlign="Middle" />
                    </td>
                </tr>
            </table>
        </td></tr>
        <%--END: SEARCH GIZMO--%>

        <%--BEGIN FEED LIST--%>
        <tr><td style="padding:3px 0px 3px 0px;"><asp:LinkButton ID="cmdViewAll" runat="server" CssClass="MenuItemActive" PostBackUrl="" CausesValidation="false" Text="* View ALL RSS Feeds"></asp:LinkButton></td></tr>                        
        <asp:XmlDataSource ID="xdsNewsFeed" runat="server" DataFile="App_Data/RSSFeeds.xml" XPath="dataroot/qryRSSFeed"></asp:XmlDataSource>
        <asp:Repeater ID="drpNewsFeed" runat="server" DataSourceID="xdsNewsFeed" EnableViewState="true" >
            <ItemTemplate>
                <tr><td style="padding:3px 0px 3px 0px;">
                    <asp:LinkButton ID="cmdSelectNewsFeed" runat="server" CssClass="MenuItem" CausesValidation="false" CommandName='<%#XPath("ID")%>'>- <%#XPath("Title")%></asp:LinkButton>
                </td></tr>
            </ItemTemplate>
        </asp:Repeater>
        <%--END FEED LIST--%>

        <tr><td>&nbsp;</td></tr>
        </table>

    </ContentTemplate>
</asp:UpdatePanel>

ЗДЕСЬ КОД СТРАНИЦЫ позади

Protected Sub drpNewsFeed_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles drpNewsFeed.ItemCommand
    Dim oLogger As New nebLogManager("TESTNWOSGN.txt")

    oLogger.TraceStart("drpNewsFeed_ItemCommand (" & Session.SessionID & ")")

    'some code that never gets run because the event is not fired...

    oLogger.TraceStop("drpNewsFeed_ItemCommand (" & Session.SessionID & ")")
End Sub


Protected Sub cmdSearch_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles cmdSearch.Click
    Dim oLogger As New nebLogManager("TESTNWOSGN.txt")


    oLogger.TraceStart("cmdSearch_Click (" & Session.SessionID & ")")

    'some code that never gets run because the event is not fired...

    oLogger.TraceStop("cmdSearch_Click (" & Session.SessionID & ")")
End Sub

Не уверен, если это важно, но он использует master_page, на котором сидит ScriptManager


Сценарий комплексного тестирования:

  1. ПОИСК К: http://www.nwosurvivalguide.com/NWOSGN.aspx
  2. ЩЕЛКНИТЕ НА ЛЕНТУ (Левая сторона)
  3. Давайте посидим 30 минут
  4. ВЕРНУТЬСЯ и нажать на другую ленту новостей

Результат >>> Событие не сработало, но страница загружается Page_Init обнаруживает время ожидания сеанса. Если вы обновите страницу, все снова станет функциональным.

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Сначала я хочу поблагодарить JHSOWTER за указание на то, что моя логика обнаружения истечения времени ожидания исходного сеанса была ошибочной. Это действительно вернуло меня на правильный путь.

Таким образом, проблема заключалась в том, что мой сеанс истекал из-за перезапуска пула приложений.

Стандартное решение SessionTimeout не будет работать, потому что я нахожусь на общем хостере, который контролирует время ожидания пула приложений.

РЕШЕНИЕ заключалось в добавлении следующих строк в файл Web.Config (внутри тега <system.web>):

<sessionState timeout="60" cookieless="false" mode="StateServer" />
<machineKey ... />

Для генерации тега ключа машины я использовал этот инструмент: http://aspnetresources.com/tools/machineKey

После этих изменений все мои проблемы исчезли.

Еще раз большое спасибо за помощь.

0 голосов
/ 10 февраля 2012

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

Firefox __doPostBack не работает после простоя

http://forums.asp.net/post/4021595.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...