クライアントページでは、JavaScriptフォームを使用してマルチパートフォームデータ(ファイル)をASP.NETサイト(ashxハンドラ)にポストします。ASP.NETアプリケーションで大きな並行HTTP POSTを処理する
ユーザーが複数のファイルを選択し、同時アップロードを開始します。ファイルが150MB +のようなものである場合、ASP.NETサーバー側の複数の同時POSTハンドラーが生成されます。
私はセッションコントロールを実装しています。キャプチャの機能とともに、自分のサーバーに侵入するボットではないかどうかを正確に知ることができます。
しかし、問題は最初のアップロードの開始です。
ハンドラがPOST
を処理するたびに、セッション(私のカスタムセッション、ユーザーのページに1つ)のIDをチェックし、セッションごとのファイルPOST
編の合計サイズにRequest.ContentLength
サイズを追加します。このデータはXMLに保存されます。
しかし、いくつかの初期投稿が同時に発生するため、XMLのライターはバイトの合計を記録し、すべての初期の034バイトのセッションを報告します。これは、同時に入力されるためです。
私はlock
を私のpersister
オブジェクトに実装しましたが(XML書き込みです)、今は1つのPOSTが完全に処理されるまで、他のものは続行できません。
また、「アップロード制限の後」にあるリクエストでは何もしませんが、サーバーにデータをアップロードするのにまだ時間がかかります。
だから私の質問は以下のとおりです。
複数の同時POST
アップロードを処理するための正しいパターンとは何ですか?
リクエストがASP.NETハンドラコードでフィルタリングされるとすぐにPOSTを削除し、クライアントにデータをIISにアップロードする作業を保存する方法はありますか?
更新:lock
XML書き込み/最大セッション長の計算でのみ、私はまだ並行性がありますが、これは良いことです。これで、ashxハンドラコードからすぐにセッションを削除する方法を知る必要があります。
は、同じファイルに書き込むすべてのHTTP要求はありますか?悪いデザインのように聞こえる。これを処理するには、いくつかのメッセージキューイングサービスを使用することを考えなければならないかもしれません。また、データをデータベースに保存することをお勧めします。 – deostroll
この場合は特に、同じセッション内(同じフォルダ内にある)に同じ名前の2つのファイルが保存されている場合です。データベースに関しては、素晴らしいアイデアですが、HttpPostedFileにはファイルシステム上のパスを取り込むSaveAsメソッドがあります。私はASP.NETで投稿されたファイルをどのようにしてDBにシリアル化するかを調べていません。 –