0

好吧,这是我一段时间以来看到的最奇怪的事情......

我正在使用 VS studio 2010 构建一个 asp.net(框架 4.0)网站。我的代码在 VB.Net 中,我的测试浏览器是 Firefox(最新版本),也在 IE8 和 Google Chrome 上测试过,行为相同。

基本上,我在 UpdatePanel 的 DataRepeater 中有一个 LinkBut​​ton。只要我经常使用页面(每隔几分钟左右),_ItemCommand 事件就会触发。

问题是这样的:当我打开另一个网页(在另一个浏览器选项卡中)并在上面坐了大约 1 小时,然后回到浏览器选项卡中的测试页面并单击链接按钮时,没有触发任何事件并且页面重新加载。就像按钮刚刚死在我身上一样。

我首先强调它可能是一个会话超时问题,但我将 SessionID 记录在一个文本文件中并且会话不会过期。<<<< 使用新方法检测超时

我可以确认(日志文件)我的问题的根源是 _ItemCommand 事件只是停止触发。我只是不知道为什么会这样。

我已经尝试过在类似问题(事件未触发)下提出的大多数解决方案,但我的问题完全不同,因为我的事件确实触发了......仅在有限的时间内。

我的中继器 ViewState 已启用。我尝试将 LinkBut​​ton 更改为 Button 但没有相同的问题。我已经尝试过提升 ScryptManager 的 AsyncPostBackTimeout ......也没有任何乐趣。我已经尝试过 sessionState 模式="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

不确定它是否重要,但它使用 ScriptManager 所在的 master_page


综合测试场景:

  1. 浏览至:http ://www.nwosurvivalguide.com/NWOSGN.aspx
  2. 单击新闻提要(左侧)
  3. 让我们坐 30 分钟
  4. 返回并单击另一个新闻源

结果 >>> 事件未触发但页面加载 Page_Init 检测到会话超时。如果您刷新页面,一切都会再次起作用。

4

2 回答 2

1

首先,我要感谢JHSOWTER指出我的初始会话超时检测逻辑存在缺陷。这真的让我回到了正确的轨道上。

所以问题是我的会话由于应用程序池回收而超时。

标准的 SessionTimeout 解决方案不起作用,因为我在一个控制应用程序池超时的共享主机上。

解决方案是将以下行添加到 Web.Config 文件(在<system.web>标签内):

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

为了生成我的机器密钥标签,我使用了这个工具: http ://aspnetresources.com/tools/machineKey

在这些改变之后,我所有的问题都消失了。

再次非常感谢您的帮助。

于 2012-02-15T16:23:09.733 回答
0

我为此搜索了一下,发现由于 AVG Link Scanner,很少有人有类似的行为。

Firefox __doPostBack 在空闲时间后不工作

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

于 2012-02-10T01:18:27.193 回答