より良い解決策が必要であることは承知していますが、今のところこの方法で解決する必要があります。aspx Web ページで [インポートの開始] ボタンをクリックすると、長いインポート プロセスが開始されます。長い時間、時には数時間かかります。タイムアウトを変更して問題ありませんが、約 1 時間後に接続サーバーのリセット エラーが発生し続けます。私はそれがasp.netライフサイクルだと思っています.IISにこのライフサイクルを長持ちさせるために変更できる設定があるかどうか知りたいです.
5 に答える
ほぼ確実に、(別のスレッドだけでなく)別のプロセスで長時間実行する作業を行う必要があります。
インポートを行うスタンドアロンプログラムを作成します。完了したら、どこかにフラグを設定し(たとえば、データベースの列)、進行状況を示すためにログファイルまたはデータベーステーブルに行を配置します。
そうすれば、あなたのページはちょうど仕事を始めます。その後、「完了」フラグが設定されるまで、数分ごとに1回セルフリフレッシュできます。ログテーブルがまだ実行中であり、死んでいないことを確認したい場合は、ログテーブルを表示できます。
これは非常に簡単なことですが、コード例が必要な場合は提供できます。
動作を説明する考慮すべきもう 1 つのポイントは、大量のメモリが消費されている場合に aspnet_wp.exe がリサイクルされることです (これをページのライフ サイクルと混同しないでください)。
長いプロセスが大量のメモリを消費している場合、ASP.NET は新しいプロセスを起動し、既存のすべての要求を再割り当てします。これを確認することをお勧めします。これを行うには、タスク マネージャーで aspnet_wp を調べ、使用されているメモリ サイズを確認します。サイズが突然元に戻った場合は、リサイクルされています。
machine.config でメモリ制限を変更できます。
<system.web>
<processModel autoConfig="true"/>
memoryLimit を使用して、ASP.NET が新しいプロセスを起動し、既存の要求を再割り当てする前に、ワーカー プロセスが消費できる合計システム メモリの割合として、最大許容メモリ サイズを指定します。(デフォルトは 60)
<system.web>
<processModel autoConfig="true" memoryLimit="10"/>
これが問題の原因である場合、唯一の解決策は、長い操作のために別のプロセスを用意することです。それに応じて IIS をセットアップして、他の EXE に関連するアクセス許可を許可する必要があります。
新しいスレッドでプロセスを実行してみてください。これは、ページがタスクを開始してからページの処理を終了することを意味しますが、別のスレッドは引き続きバックグラウンドで実行されます。ただし、視覚的なフィードバックを得ることができないため、進行状況をデータベースに記録し、代わりに別のページに表示することをお勧めします。
さまざまな制限があるポストバックの代わりに、これを ajax 呼び出しとして実行することもできます...
これがこれを行う方法ではないことを認識しているため、代替案をリストしません。あなたは彼らが何であるか知っていると確信しています:)
タイムアウトを延長することは、間違いなくそれを行う方法ではありません。応答時間は最小限に抑える必要があります。可能であれば、この長時間実行されるタスクを ASP.NET アプリケーションから完全に外して、別のプロセスとして実行するようにします。
その後、どのように進めたいかはあなた次第です。AJAX を介して、またはユーザーが F5 キーを押すことにより、ASP アプリケーションがポーリングできるファイルにプロセスの結果をダンプすることができます。
数時間かかる場合は、これについて別のスレッドを作成し、サーバーから結果をダウンロードする準備ができたときに通知を電子メールで送信することをお勧めします (つまり、完成した結果へのリンクを送信します)。
または、クライアントのブラウザーに UI を配置することが重要な場合 (n 時間ぶらぶらする場合)、SetInterval を使用してクライアント (JavaScript) から呼び出される WebMethod を使用して、完了したかどうかを定期的にチェックすることができます。