HTTPハンドラーの処理が完了したことをクライアント側でどのように知ることができますか?
-
02-07-2019 - |
質問
おそらく簡単な解決策に対する長い質問ですが、ここに行きます...
複数のファイルを選択してサーバーに送信するためのカスタムメイドのシルバーライトコントロールがあります。 WebCLientコントロールのOpenWriteAsyncメソッドを使用して、ファイルを汎用ハンドラー(FileReciever.ashx)に送信します。
基本的に、silverlightコードは各ファイルに対して次のような処理を行います。
WebClient client = new WebClient();
client.OpenWriteCompleted += (sender, e) =>
{
PushData(data, e.Result);
e.Result.Close();
data.Close();
};
client.OpenWriteAsync(handlerUri);
サーバー側ハンドラーは単に着信ストリームを読み取り、その後、結果のバイト配列でさらに処理を行います。
問題は、すべてのデータが回線を介して送信されるとすぐに、クライアント側のOpenWriteCompletedが実行されることです。その後、私のコードは次のファイルに続きます。本当に欲しいのは、ASHXハンドラーがそのリクエストの処理をすべて完了するまで待つことです。それ、どうやったら出来るの? WebClientに待機メカニズムはありますか?ハンドラーのHttpContextでできるコールバックはありますか?他の種類の転送技術を使用する必要がありますか?アドバイスしてください!
解決
Hrm、おそらく簡単な解決策は、URLにGUIDをタグ付けすることです(GUIDは、ファイルごとに一意であるか、状況に応じて適切な転送を行います)。次に、GUIDに基づいて他のサービスのステータスを確認できる別のシンプルなWebサービスを作成し、silverlightクライアントにその新しいサービスにその処理ステータスを問い合わせさせることができます(新しいWebサービスに過去の転送)。
他のヒント
Silverlight フォーラムでも同じ質問がされています。マイクロソフトは、WebClientとOpenWriteAsyncを使用してそれを行うことはできないと答えました。ユーザーUploadStringAsyncまたはHttpWebRequestのいずれかが必要です。
ハンドラーから返されるデータの転送に時間がかかり、その間サーバーが使用されていないことを懸念していると思います。サーバーがいつ処理を完了したかを知る方法がないため、アーキテクチャを変更せずにこれを行うことはできないと思います。
別の要求でハンドラーの結果を取得するために使用できる、ある種の識別子(GUIDやintなど)のみをハンドラーに設定します。そのため、ページはハンドラーを呼び出し、ハンドラーは結果を保存して識別子を返し、ページは2回目にハンドラーを呼び出し、別のハンドラーを呼び出して最初の呼び出しの結果を取得します。これにより、データの転送中にサーバーが使用中になります。
または、JavaScript(jQuery)を使用してそれを行うことができます。つまり、JavaScriptを使用してもかまわない場合。
ファイルがそれほど大きくなく、各ファイルをメモリ内に保持するのが適切な場合、Ifいが効果的なソリューションは、ファイルを文字列に変換し、UploadStringAsyncメソッドを使用して送信することです。
ファイルサイズに制限がない場合は、このアプローチを避けてください。ただし、ファイルサイズが比較的小さくなる場合は、このアプローチを使用できます。