ほとんどの場合、何千もの要求に対して正常に動作するユーザー コントロールがありますが、通常は 1 日に 1 ~ 2 回、aspx.vb のコード ビハインド内の Page_Load メソッドの最初の行を指す ArgumentOutOfRangeException があります。ファイル。自分で複製することはできませんでしたが、エラーの詳細/スタック トレースをログに記録します。問題は、エラーが実際に Page_Load ブロックで発生していないことを確信していますが、スタック トレースはそうでないことを示しています。実際、そこにあるコードは問題ではありません。これを証明するために、Page_Load にダミーコードを配置し、公開して、次のように次の発生を待ちました...
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim abc As Integer = 123
abc = abc + 1
...
End Sub
案の定、エラーが最終的に再び発生したとき、まだ Page_Load の最初の行を指していました (16 行目: Dim abc As Integer = 123)。明らかに、これは ArgumentOutOfRangeException を生成するタイプのステートメントではありません。
Type: System.ArgumentOutOfRangeException
Message: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
Source: mscorlib
TargetSite: Void ThrowArgumentOutOfRangeException()
StackTrace: at System.ThrowHelper.ThrowArgumentOutOfRangeException()
at aut.ProductWithColorChoice.Page_Load(Object sender, EventArgs e) in F:\Visual Studio Projects\1003\templates\usercontrols\ProductWithColorChoice.ascx.vb:line 16
at System.EventHandler.Invoke(Object sender, EventArgs e)
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
.ascx ページで使用されている唯一のインライン コードは、ページが完全に読み込まれるまでコントロールを無効にするために、コントロールの ClientId を取得する JavaScript ブロックで実際に見つかります。
<%@ Control Language="vb" AutoEventWireup="false" Inherits="aut.ProductWithColorChoice" %>
<script language="javascript" type="text/javascript">
(function () {
Sys.Application.add_load(setupButtonDisablers);
function setupButtonDisablers() {
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(onPageLoad);
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onSubmit);
Sys.Application.remove_load(setupButtonDisablers);
}
function onPageLoad() {
findAndEnable('<%= AddToCartImageButton.ClientID %>');
}
function onSubmit() {
findAndDisable('<%= YearDropDownList.ClientID %>');
findAndDisable('<%= MakeDropDownList.ClientID %>');
findAndDisable('<%= ModelDropDownList.ClientID %>');
findAndDisable('<%= ColorDropDownList.ClientID %>');
findAndDisable('<%= AddToCartImageButton.ClientID %>');
}
function findAndDisable(id) { findAndSetDisabledProperty(id, true); }
function findAndEnable(id) { findAndSetDisabledProperty(id, false); }
function findAndSetDisabledProperty(id, value) {
var control = $get(id);
if (control) control.disabled = value;
else alert('could not find ' + id);
}
})();
</script>
このエラーは、データ バインドされたドロップダウン リストの autopostback イベントを介して発生する可能性が高いポストバックで常に発生することをログから収集しました。
関連する場合に備えてもう 1 つ言及しておくべきことは、このコントロールは ProductControlBase という別のクラスを継承し、さらにそれが UserControl を継承するということです。ただし、実際にエラーが発生していた場合は、スタック トレースがそれを示していると思います。
私は長い間この問題に悩まされてきました。その例外の原因についての洞察、または問題に関する詳細なデバッグ情報を取得する方法に関するいくつかの提案をいただければ幸いです (ただし、直接複製することはできません)。
2012 年 12 月 7 日更新 まだ解決していませんが、進展はありました。おそらくコンパイラの最適化が原因で、スタックトレースがコードの正しい行を指していないことがわかりました.エラーはおそらくこのブロックの数行下にあります.ifステートメントのチェックを考慮すると、 sizeIndex は 0 から 6 の範囲にありませんか? 注: PaintSizes、RegularPaintPrices、および PaintWeights はすべて、それぞれに 7 つの文字列を持つ Specialized.StringCollections です。
If My.Settings.PaintSizes.Contains(SizeOption) Then
sizeIndex = My.Settings.PaintSizes.IndexOf(SizeOption)
Price = Decimal.Parse(My.Settings.RegularPaintPrices(sizeIndex))
Weight = Double.Parse(My.Settings.PaintWeights(sizeIndex))
Else
Throw New ApplicationException(Me.ID & ": sizeoption must match exactly one of the values in PaintSizes located in the web.config file")
End If