4

ファイルまたはデータ ストリームを Web サーバーにアップロードしようとしていますが、適切な方法が見つかりません。WebClient私は両方を試しましたが、WebRequestどちらにも問題があります。

WebClient 素晴らしく
簡単ですが、非同期アップロードが完了したという通知がなく、UploadProgressChangedイベントがコールバックされず、有用なものが得られません。別の方法は、バイナリ データを文字列に変換して使用するUploadStringASyncことです。これは、少なくともUploadStringCompleted.

HttpWebRequest
少し複雑ですが、それでも必要なことを行います。問題は、バックグラウンド スレッドで呼び出されても (おそらく)、アップロードが完了するまで UI とブラウザー全体をブロックしているように見えることです。かなり正しい。

通常の .net にはOnUploadDataCompletedWebClientと progressのための適切なメソッドがいくつかありますが、Silverlight .net ではこれらのメソッドを使用できません ... 大きな省略があると思います!

誰にも解決策はありますか?複数のバイナリ ファイルをできれば進行中にアップロードする必要がありますが、ファイルのアップロードが完了したら、いくつかのアクションを実行する必要があります。

これについての助けを楽しみにしています。

4

4 に答える 4

1

私がそれを回避する方法は、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 は二重および三重の非同期呼び出しのため PiTA です。

于 2008-08-15T20:17:44.257 に答える
0

マット・バーセスはこれについていくつかの考えを持っていましたが、役立つかもしれません:

http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html

@Dan - 申し訳ありませんが、Matt の記事は Silverlight に関するものであると断言できますが、明らかにそうではありません。私がちょうど落としたチリの赤の2つの大きなグラスのせいです. :-)

于 2008-08-15T19:44:06.680 に答える
0

ありがとう、私が記事で見ることができる問題は、それがSilverlightについて話していないことです.Silverlightは機能が制限されています.何らかの理由で、バイナリ転送に必要なイベントとメソッドが理由もなく削除されています.

複数のファイルをアップロードする必要がある/したいので、Silverlight を使用する必要がありますが、HTML では複数のファイルをアップロードできません。

于 2008-08-15T19:56:42.910 に答える
0

これは私がやっていることのほとんどでした。私が得ていた問題は、私の UI が動かなくなることでした。

あなたが私がすでに行っていたことを示唆したように、問題は別の場所にあると推測したので、古い分割統治法を使用して問題を絞り込みましたが、実際の更新コードではありませんでした。プログレスバーを更新するリクエストをディスパッチする試みでしたストリーム コードのアップロード中。

アドバイスをありがとう。

于 2008-08-15T23:01:08.280 に答える