2

私は以前に多くのステップを踏んでいると確信していますが、この1つの問題を解決できないようです. 目標は、リアルタイム プログレス バー (潜在的に複数のファイル) を持つ ASP.NET 2.0 サイト用のファイル アップロード ページを作成することです。

私はすでにソリューションのほとんどの部分を実装してテストしました。しかし、愚かなことに、私はそれをすべて一緒に機能させることができないようです.

  1. 関連するリクエストに対して PreRequestHandlerExecute イベント (元々は BeginRequest を使用していましたが、Session へのアクセスが必要でした) を処理するカスタム HttpModule を作成し、HttpWorkerRequest オブジェクトを使用して受信フォームの投稿データをチャンクで解析します。リアルタイムの進行状況はセッションに保存されます。

  2. セッションから抽出した進行状況情報を使用して jQuery 要求に JSON を返す ScriptMethod を提供する同じアプリケーションで Web サービスを構築しました。これをテストし、動作します。

私の問題は、(1) の処理中に (2) の ScriptMethod の jQuery ポーリングを実行できなかったことです。 jQuery 呼び出しはどこかでキューに入っているように見え、アップロードが完全に送信されるとすぐに、すべてが「100%」で突然返されます。したがって、非同期部分は機能していません。

私が試したこと:

  • .ajaxForm() (jQuery Forms プラグイン) を使用してファイル アップロード ポストを送信します。
  • IFRAME を使用したネストのさまざまなシナリオ。
  • 最初のページからアップロードを送信している間、別のページ (別のブラウザー タブ) でポーリング jQuery を実行します。ポーリングは停止し、最初のページが完了するまでキューに入れられます。

他の人がうまくいったと主張する他の非常によく似たソリューションをオンラインで見たので、それは可能であるに違いありません。

アップデート:

問題は解決され、すべてが機能するようになりました。SessionState ロックに関する以下の私自身の回答を参照してください。

4

2 に答える 2

0

私は最終的に原因に出くわしました: ASP.NET SessionState のロック。

問題はエレガントに提起され、この SO 投稿で回答されました: ASP.net セッション要求キューイング

この側面は、ASP.NET ファイル アップロードのリアルタイム進行に関するオンライン資料のいずれにも言及されておらず、上記の最初のコメントで言及した解決策の少なくとも 1 つが、EnableSessionState="false"アップロード ページのディレクティブで明示的に設定されていませんでした。その使用に関する苦情。(リーダー/ライター ロックの利点のために、読み取り専用に設定することもできることに注意してください)。

つまり、ユーザーの Session オブジェクトをインスタンス化すると、EnableSessionState が既定で True であるため、そのユーザーの今後の同時ページ要求はすべて既定でブロックされます。キャリアの早い段階でこの問題に遭遇したことがないことに、正直驚いています。とにかく、それが他の誰かを助けることを願っています。記録として、Flash や HTML5 を使用しなくても、ASP.NET 2.0 でリアルタイム プログレス バーが問題なく動作するようになりました。ステータスは、アプリケーションの状態を通じて追跡されるようになりました。

于 2012-12-18T09:50:34.317 に答える
0

また、上記で参照した 2 つのリンクについて非常に簡単なコメントをして、これらのコードベースの重大な問題によって他の人が迷子にならないようにします。

  • Sunasara Imdadhusen によるプログレス バーを使用した ASP.NET ファイルのアップロード: この例はきれいに見えますが、ファイルのアップロードが既に完全に完了した後で、ディスクへのファイルの書き込みの進行状況を追跡するだけなので、実質的には役に立ちません (通常、大きなファイルの長い部分)。 .

  • Travis Whidden によるアップロード ファイルの進行状況をサポートする ASP.NET ファイルのディスクへの直接投稿: このコードはカスタム HttpModule を実装してアップロードをリアルタイムで監視するため、出発点としてははるかに優れています。ただし、バッファ処理クラス FileProcessor.cs にはさまざまなバグがあり、書き直す必要があります。また、HTTP 仕様に従ってヘッダー自体からフォーム ポスト境界文字列を抽出するのが最も安全です。

最後に、.NET 4.0 および MVC 3+ の場合、新しい Request.GetBufferlessInputStream() メソッドにより、同等のソリューションがはるかに簡単になります。詳細については、次の記事を参照してください: http://vanacosmin.ro/Articles/Read/AjaxFileUpload

于 2012-12-18T10:03:08.573 に答える