1

おそらく簡単な解決策についての長い質問ですが、ここに行きます...

複数のファイルを選択してサーバーに送信するためのカスタムメイドの Silverlight コントロールがあります。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 で実行できるコールバックはありますか? 他の種類の転送技術を使用する必要がありますか? ご意見をお聞かせください!

4

5 に答える 5

1

同じ質問がSilverlightフォーラムでも行われています。Microsoftが承認した答えは、WebClientとOpenWriteAsyncではそれができないというものでした。UploadStringAsyncまたはHttpWebRequestのいずれかを使用する必要があります。

于 2011-11-30T10:51:47.387 に答える
0

または、JavaScript(jQuery)でそれを行うこともできます...JavaScriptを使用してもかまわない場合はそうです。

于 2008-09-30T13:15:42.857 に答える
0

ファイルがそれほど大きくなく、それぞれをメモリに保持できる場合は、ファイルを文字列に変換し、UploadStringAsync メソッドを使用して送信するのが、醜いですが効果的な解決策です。

ファイル サイズが無制限の場合はこの方法を避けてください。

于 2008-09-30T17:46:33.813 に答える
0

うーん、おそらく簡単な解決策は、URLにGUIDをタグ付けすることです(GUIDはファイルごとに一意であるか、転送など、状況に応じて意味があります)。次に、GUID に基づいて他のサービスのステータスをチェックできる別の単純な Web サービスを用意し、Silverlight クライアントにその新しいサービスの処理ステータスを照会させることができます (新しい Web サービスに GUID を渡すことによって)。過去の転送)。

于 2008-09-30T11:24:48.210 に答える
0

ハンドラーから返されるデータの転送に時間がかかり、その間サーバーが使用されていないことを懸念していると思います。サーバーがいつ処理を完了したかを知る方法がないため、アーキテクチャを変更せずにこれを行うことはできないと思います。

別の要求でハンドラーの結果を取得するために使用できる、ある種の識別子 (GUID や int など) のみをハンドラーに持たせます。したがって、ページはハンドラーを呼び出し、ハンドラーは結果を保存して識別子を返し、ページはハンドラーを 2 回目に呼び出し、別のハンドラーを呼び出して最初の呼び出しの結果を取得します。これにより、データの転送中にサーバーが使用されたままになります.

于 2008-09-30T11:31:09.893 に答える