小さな金融サイトを運営しています。このサイトの一部では、特定のユーザーが銀行口座の調整を実行し、銀行取引明細書に表示される入力済みの行をクリアすることができます。この特定のページは、ユーザーが調整されたデータを送信したり、使用しているアカウントと日付を変更したりすると、サイトが使用している ClientId を失うため、ランダムに見えるため、いくつかの頭痛の種になっています。これはせいぜい、少し面倒です。最悪の場合、チェックしたばかりのすべての行を再チェックする必要があるため、多くの時間が無駄になります。
ClientId は Session に格納されているため、最初に考えたのは、Session が失われているか、Application がリサイクルされているということです。ただし、ClientId セッション変数 (「ActiveClient」として格納されている) のみが失われます。PortalId などの他のものはそのまま残ります (これは実際にはサイトの重大なエラーから回復するために使用されます)、それは問題ではありません。次に、ページがポストバックで非常に多くのデータを送信したためだと思いました (MaxHttpCollectionKeys
このページでは 2 回レイズする必要がありましたが、現在は 5000 になっていますが、最近データの受け渡し方法を変更してキーの数を半分に減らしました)。ただし、これも問題ではありません。なぜなら、私が取得しているエラー レポートには、作業中の日付/アカウントを変更するときに、数十個またはほんの一握りのキーしかない送信も含まれているためです。
それはさまざまなタイミングで発生し、毎回発生するわけではありません (ページ送信のパーセンテージとして、約 5 ~ 10% であると言えます)。 Internet Explorer ではなく、FireFox と Chrome からのものです。ただし、私たちのオフィスでは主に両方を使用しています。IE は、それを使用しなければならないサイトにスタッフが遭遇した場合にのみ使用されます。同僚の 1 人に IE への切り替えを試みるように依頼しましたが、それまでの間、他の手がかりを見つけようとしています。
このページには、クレジット用とデビット用の 2 つの ListView が設定されています。金融システムの取引詳細行ごとに 1 行が表示されます。この行には、取引に関する簡単な情報が一覧表示され、ユーザーはそれを決済済としてマークするオプションを提供します (または、以前の調整済み明細書を思い出す場合は、未決済としてマークします)。
<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 を解析し、行が以前にクリアされて現在はクリアされていない場合、またはその逆の場合にのみアクションを実行します。そこから財務ファイルを更新して、その行を清算済みまたは清算済みとしてマークします。すべての更新が正常に行われた場合、アカウントは、指定された日付に関連する期間について、指定された日に調整されたものとしてマークされます。
誰かが役立つと思われる場合は、コードをさらに投稿できます。ただし、前述したように、この問題はユーザーがアカウントと日付を変更しただけでも発生するため、コード自体に問題があるとは思えません。参考までに、「Working」という静的クラスに保持されている ActiveClient プロパティのコードを次に示します。
public static String ActiveClient {
get {
String s = (String)HttpContext.Current.Session["ActiveClient"];
return s ?? String.Empty;
}
set { HttpContext.Current.Session["ActiveClient"] = value; }
}
tl;dr: 1 つだけのページが送信時にセッション変数を 1 つ、(明らかに) 1 つだけ失うことがありますが、それを停止する理由や方法がわかりません。