Silverlight 2b2 を使用してバイナリ データをアップロードする
-
08-06-2019 - |
質問
ファイルまたはデータのストリームを Web サーバーにアップロードしようとしていますが、適切な方法が見つかりません。両方試してみました WebClient
そして WebRequest
どちらも問題を抱えています。
ウェブクライアント
便利で簡単ですが、非同期アップロードが完了したという通知は表示されません。 UploadProgressChanged
イベントは有用なものをコールバックしません。別の方法は、バイナリ データを文字列に変換して使用することです。 UploadStringASync
なぜなら、そうすれば少なくともあなたは UploadStringCompleted
, 問題は、すべてのデータをエンコードして一度にアップロードするため、大きなファイルには大量の RAM が必要になることです。
HttpWebRequest
少し複雑ですが、それでも必要なことは実行します。私が抱えている問題は、バックグラウンドスレッドで呼び出されているにもかかわらず(おそらく)、アップロードが完了するまで依然としてUIとブラウザ全体をブロックしているように見えることです。これは完全ではないようです右。
通常の .net には適切な機能がいくつかあります WebClient
のためのメソッド OnUploadDataCompleted と進捗がありますが、これらはSilverlight .netでは利用できません...大きな省略だと思います!
誰かが解決策を持っていますか。できれば進行状況とともに複数のバイナリファイルをアップロードする必要がありますが、ファイルのアップロードが完了したときにいくつかのアクションを実行する必要があります。
これに関して何らかの助けを期待してください。
解決
これを回避する方法は、INotifyPropertyChanged とイベント通知を使用することです。
必需品:
public void DoIt(){
this.IsUploading = True;
WebRequest postRequest = WebRequest.Create(new Uri(ServiceURL));
postRequest.BeginGetRequestStream(new AsyncCallback(RequestOpened), postRequest);
}
private void RequestOpened(IAsyncResult result){
WebRequest req = result.AsyncState as WebRequest;
req.BeginGetResponse(new AsyncCallback(GetResponse), req);
}
private void GetResponse(IAsyncResult result)
{
WebRequest req = result.AsyncState as WebRequest;
string serverresult = string.Empty;
WebResponse postResponse = req.EndGetResponse(result);
StreamReader responseReader = new StreamReader(postResponse.GetResponseStream());
this.IsUploading= False;
}
private Bool_IsUploading;
public Bool IsUploading
{
get { return _IsUploading; }
private set
{
_IsUploading = value;
OnPropertyChanged("IsUploading");
}
}
現在、Silverlight は二重および三重の Async 呼び出しがあるため PiTA です。
他のヒント
ありがとう、この記事でわかる問題は、Silverlight については触れておらず、Silverlight の機能は限られており、何らかの理由でバイナリ転送に必要なイベントとメソッドの一部が理由もなく削除されているということです。
複数のファイルをアップロードする必要があるため、Silverlight を使用する必要がありますが、HTML では複数のファイルのアップロードが許可されていません。
Matt Berseth 氏はこれに関していくつかの考えを持っており、役立つかもしれません:
http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html
@ダン - 申し訳ありませんが、Matt の記事は Silverlight に関するものだと断言できますが、明らかにそうではありません。それは私がたった今飲み干したチリ産赤ワインの大きなグラス 2 杯のせいだ。:-)
これは私がやっていたこととほぼ同じでしたが、私が抱えていた問題は、UI がロックされてしまうことでした。
あなたがすでに何をしていたかを示唆したように、問題は別の場所にあると推測したので、問題を絞り込むために古い分割統治を使用しました。それは実際の更新コードではなく、私の試みでした。 急送 ストリーム コードのアップロード中に進行状況バーを更新するリクエスト。
アドバイスありがとうございます。