私はより大きなプロジェクトでこの問題に遭遇し、縮小された単一ページのシナリオでそれを特定して再現することができました. このページには、1 つのボタン コントロールbtnSubmit
と、次のようなコード ビハインドがあります。
private int n = 100;
protected void Page_Init(object sender, EventArgs e) {
btnSubmit.Click += btnSubmit_Click;
}
protected void Page_Load(object sender, EventArgs e) {
if (!Page.IsPostBack) {
Session["test"] = "Hello World";
for (int i = 0; i < n; i++) {
using (StreamWriter file = new StreamWriter(Server.MapPath("/sample.txt"), true)) {
file.WriteLine(i);
}
}
} else {
int sessionCount = Session.Count;
string test = Session["test"].ToString();
}
}
void btnSubmit_Click(object sender, EventArgs e) {
}
上記のコードは、ページの読み込み時に 2 つのことを行います。最初に、文字列「Hello World」をセッション変数に割り当てますtest
。2 つ目は、0 から 99 までの整数をテキスト ファイル "sample.txt" の異なる行に書き込みます。をクリックするとbtnSubmit
、ポストバックがトリガーされます (ページをポストバックするためだけに、ボタンは他に何もしません)。ポストバック後、 と のsessionCount = 1
値test = "Hello World"
。これは予想される動作であり、上記のコードは問題なく動作します。
n = 9000
または大きな整数を変更すると、ポストバック時に (をクリックしてbtnSubmit
)、セッション変数Session["test"]
は null になり、sessionCount = 0
. 存在しないためtest
、例外をスローします。Session["test"]
何を与える?私の開発マシンには 6GB の RAM が搭載されています。数千の整数を処理するのにそれほど時間はかからないため、メモリ不足が原因である可能性は低いです。