【发布时间】:2012-02-08 03:12:55
【问题描述】:
好吧,这是我最近看到的最奇怪的事情......
我正在使用 VS studio 2010 构建一个 asp.net(框架 4.0)网站。我的代码在 VB.Net 中,我的测试浏览器是 Firefox(最新版本),也在 IE8 和 Google Chrome 上测试过,行为相同。
基本上,我在 UpdatePanel 的 DataRepeater 中有一个 LinkButton。 只要我经常使用页面(每隔几分钟左右),_ItemCommand 事件就会触发。
问题是这样的:当我打开另一个网页(在另一个浏览器选项卡中)并在上面停留大约 1 小时左右,然后回到浏览器选项卡中的测试页面并单击链接按钮时,没有触发任何事件并且页面重新加载。就像按钮刚刚死在我身上一样。
我首先强调这可能是会话超时问题,但我将 SessionID 记录在文本文件中,并且会话不会过期。
我可以确认(日志文件)我的问题的根源是 _ItemCommand 事件只是停止触发。我只是不知道为什么会这样。
我已经尝试过针对类似问题(事件未触发)提出的大多数解决方案,但我的问题完全不同,因为我的事件确实触发了......仅在有限的时间内。
我的中继器 ViewState 已启用。 我尝试将 LinkButton 更改为 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> </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
综合测试场景:
- 浏览至:http://www.nwosurvivalguide.com/NWOSGN.aspx
- 点击新闻提要(左侧)
- 让我们坐 30 分钟左右
- 返回并单击另一个新闻源
结果 >>> 事件未触发但页面加载 Page_Init 检测到会话超时。 如果您刷新页面,一切都会再次正常运行。
【问题讨论】:
-
"我在文本文件中记录了 SessionID" - 这如何确保会话没有超时?我认为默认超时是 20 分钟,所以如果您等了一个小时并且您的文本文件说会话没有超时,并且您没有更改 web.config 中的超时,那么我认为您正在记录不要做你认为它正在做的事情。
-
会话 ID 存储在 cookie 中,后续会话即使在服务器端超时,也会重复使用 cookie 的 aspnet_sessionId 值。
-
嗯,我明白了...我的印象是每个新会话都会获得一个新的 SessionID...这就是它在本地的行为...我尝试将会话超时增加到 120 分钟...仍然没有喜悦。我知道即使我将会话超时设置为 120,某些服务器设置可能会覆盖此设置...任何人有一个好主意来帮助我检查会话是否过期?
-
jhshowter,顺便说一句,感谢您的提示。您是否认为会话超时会导致这种“死按钮”行为?
-
使用页面标记和 ItemCommand 事件发布您的代码。如果您想知道会话何时超时,请将其记录在 Global.asax 文件中的 Session_End event 中。这可能与会话有关,但这取决于您的代码的作用。
标签: asp.net vb.net events datarepeater