我维持一个小型金融网站。该网站的一部分允许某些用户执行银行帐户对帐,清除已显示在银行对帐单上的行。这个特定的页面让我有些头疼,因为,当用户提交协调数据或甚至只是更改他们正在使用的帐户和日期时,似乎随机,该网站将失去他们正在使用的ClientId。这充其量只是轻微烦人的;在最坏的情况下,浪费了很多时间,因为他们刚检查过的所有线路都必须重新检查。
ClientId存储在Session中,所以我首先想到的是会话丢失或应用程序正在被回收。但是,只有ClientId Session变量(存储为“ActiveClient”)丢失;像PortalId这样的其他东西仍然存在(这实际上用于从网站上的严重错误中恢复),所以这不是问题。然后我认为,因为页面提交了大量关于回发的数据(我不得不为此页面提升MaxHttpCollectionKeys
两次,现在它已经是5000,尽管我最近更改了数据的传递方式,将键数减少了一半) 。但是,这也不是问题,因为我收到的错误报告还包括只有几十个密钥的提交,或者当他们更改正在使用的日期/帐户时只提供少量密钥。
它发生在不同的时间,它不会每次都发生(作为页面提交的百分比,我说它大约是5-10%),并且在所有错误中似乎唯一似乎是常量的是他们来自FireFox和Chrome,而不是Internet Explorer。但是,我们的办公室主要使用这两者; IE仅在员工遇到必须使用它的网站时使用。我已经让我的一位同事尝试切换到IE,但我仍然试图在此期间找出其他潜在客户。
页面设置有两个ListView,一个用于Credits,另一个用于Debits。它们为金融系统中的每个交易明细行显示一行,其中列出了有关交易的简要信息,并为用户提供了将其标记为已清除的选项(或者,如果调用先前已对帐的对帐单,则将其标记为未清除)。
<ItemTemplate>
<tr class='<%# UseFutureDateClass(Eval("TrxDate")) %> <%# Container.DisplayIndex % 2 == 1 ? "alt" : "" %>'>
<td>
<asp:CheckBox ID="ClearLine" runat="server" Checked='<%# IsCleared(Eval("DateCleared")) %>' />
<asp:HiddenField ID="IdentSet" runat="server" Value='<%# Eval("NRecord") + "," + Eval("LineNo") + "," + IsCleared(Eval("DateCleared")) %>' />
</td>
<td><asp:Label ID="TrxDateLabel" runat="server" Text='<%# Eval("TrxDate","{0:MM/dd/yyyy}") %>' /></td>
<td><asp:Label ID="HeaderReference" runat="server" Text='<%# Eval("HeaderReference") %>' /></td>
<td><asp:Label ID="VendorInfoLabel" runat="server" Text='<%# Eval("VendorInfo.VendorName") %>' /></td>
<td><asp:Label ID="Label2" runat="server" Text='<%# Eval("Description") %>' /></td>
<td class="money">
<asp:Label ID="Amount" runat="server" Text='<%# FormatInvertMoney(Eval("Amount")) %>' />
</td>
</tr>
</ItemTemplate>
第一个<td>
包含在每个行的表单提交时张贴的信息。提交后,页面将解析IdentSet并仅在先前已清除该行时执行操作,现在不是,反之亦然。从那里它将更新财务文件以将该行标记为已清除或未清除;如果所有更新都成功,则会将该帐户标记为在给定日期与指定日期相关的期间进行了对帐。
如果有人认为有用,我可以发布更多代码;但是,正如我之前所说,当用户只更改帐户和日期时,也会发生此问题,因此我不认为问题出在代码本身中。作为参考,这里是ActiveClient属性的代码,在一个名为“Working”的静态类中维护:
public static String ActiveClient {
get {
String s = (String)HttpContext.Current.Session["ActiveClient"];
return s ?? String.Empty;
}
set { HttpContext.Current.Session["ActiveClient"] = value; }
}
tl; dr:一个,只有一个页面有时会丢失一个,并且(显然)只有一个会话变量在提交时,我无法弄清楚为什么或如何阻止它。