好的,这是我偶尔看到的最奇怪的事情......
我正在使用VS studio 2010构建一个asp.net(框架4.0)网站。我的代码背后是VB.Net,我的测试浏览器是Firefox(最新版本),也在IE8和谷歌Chrome上测试过,行为相同。
基本上我在UpdatePanel中的DataRepeater中有一个LinkButton。 只要我定期使用页面(每隔几分钟左右),_ItemCommand事件就会发生火灾。
问题是这样的:当我打开另一个网页(在另一个浏览器选项卡中)并坐在它上面大约1个小时左右然后回到浏览器选项卡中的测试页面并单击LinkButton时,没有事件被触发并且页面重新加载。就像按钮刚刚死在我身上一样。
我首先强调它可能是Session TimeOut问题,但我在一个文本文件中记录了SessionID,并且Session DOES NOT expire。 <<<<使用新方法检测TimeOut
我可以确认(日志文件)我的问题的根源是_ItemCommand事件只是停止触发。我不知道为什么会这样。
我已尝试过在类似问题下提出的大多数解决方案(事件未解雇),但我的问题是积极的不同,因为我的事件发生了......只是在有限的时间内。
我的Repeater ViewState已启用。 我已经尝试更改Button的LinkButton但没有同样的问题。 我已经尝试过提升ScryptManager的AsyncPostBackTimeout ......也没有任何乐趣。 我试过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> </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全面的测试场景:
结果&gt;&gt;&gt;事件未被触发但页面加载 Page_Init检测到会话超时。 如果刷新页面,一切都会再次正常运行。
答案 0 :(得分:1)
首先,我要感谢 JHSOWTER 指出我的初始会话超时检测逻辑存在缺陷。这真的让我回到了正确的轨道上。
所以问题是由于应用程序池的回收,我的会话超时了。
标准的SessionTimeout解决方案不起作用,因为我在控制应用程序池超时的共享主机上。
解决方案是将以下行添加到Web.Config文件中(在<system.web>
标记内):
<sessionState timeout="60" cookieless="false" mode="StateServer" />
<machineKey ... />
要生成我的机器密钥标签,我使用了这个工具: http://aspnetresources.com/tools/machineKey
在这些改变之后,我的所有问题都消失了。
再次感谢你的帮助。
答案 1 :(得分:0)
我为此搜索了一下,发现很少有人因为AVG Link Scanner而有类似的行为。