2012-03-30 9 views
6

クライアントページでは、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ハンドラコードからすぐにセッションを削除する方法を知る必要があります。

+0

は、同じファイルに書き込むすべてのHTTP要求はありますか?悪いデザインのように聞こえる。これを処理するには、いくつかのメッセージキューイングサービスを使用することを考えなければならないかもしれません。また、データをデータベースに保存することをお勧めします。 – deostroll

+0

この場合は特に、同じセッション内(同じフォルダ内にある)に同じ名前の2つのファイルが保存されている場合です。データベースに関しては、素晴らしいアイデアですが、HttpPostedFileにはファイルシステム上のパスを取り込むSaveAsメソッドがあります。私はASP.NETで投稿されたファイルをどのようにしてDBにシリアル化するかを調べていません。 –

答えて

関連する問題