2

現在、ポータブル ライブラリの Web サービスを使用してサーバーからファイルをアップロードしようとしています。ファイルごとに、次のようにします。

WebRequest request = WebRequest.Create("http://localhost:49364/" + url);

 request.BeginGetResponse((aResult) =>
 {
      var retour = aResult.AsyncState as WebRequest;
      WebResponse reponse = retour.EndGetResponse(aResult);
      callback(reponse);
 }, request);

私のコールバックメソッドで、私はこれを作ります:

byte[] bytes;
string currentFileName = fileName;
string categorie = currentFileName.Split('/').ElementAt(0);
string dir = currentFileName.Split('/').ElementAt(1);

using (var reader = new BinaryReader(reponse2.GetResponseStream()))
{
    bytes = new byte[reponse2.ContentLength];
    reader.Read(bytes, 0, (int)reponse2.ContentLength);
}
fileService.EnsureFolderExists(categorie);
fileService.EnsureFolderExists(fileService.PathCombine(categorie, dir));
fileService.WriteFile(currentFileName, bytes);

ファイル全体をバイト配列として取得します。しかし、winRT を使用すると、ファイルの書き込みがすぐに停止し、ローカル ファイルが完成しません。ファイルを 1 つだけアップロードしようとすると、書き込みも停止します。しかし、Silverlight で試してみると (MvvmCross を Silverlight に拡張しました)、書き込みは完了です。MonoDroid と MonoTouch はまだテストしていません。

だから、私の質問は:なぜ書き込みが停止するのですか?

4

2 に答える 2

1

スチュアート、

まず、あなたの答えをありがとう!

私はあなたの例を試し、私の場合に適応させました(Webサービスを介してサーバーからファイルをアップロードします)。最初はすべてうまくいきました。すべてのファイルが正しくアップロードされます。しかし、アップロードする画像を追加すると、同じ問題が発生しました。画像ファイルとテキスト ファイルは完全ではありません。

しかし、あなたの例のコードを見て、私は解決策を見つけました。問題がどこにあるのか本当に理解していないと思いました。

作品を書くために、これを(コールバックメソッドで)置き換えました:

...

using (var reader = new BinaryReader(reponse2.GetResponseStream()))
{
    bytes = new byte[reponse2.ContentLength];
    reader.Read(bytes, 0, (int)reponse2.ContentLength);
}
...
fileService.WriteFile(currentFileName, bytes);

これで :

...

var mem = new MemoryStream();
using (var stream = reponse2.GetResponseStream())
{
        stream.CopyTo(mem);
}
mem.Seek(0L, SeekOrigin.Begin);
...
fileService.WriteFile(currentFileName, mem.ToArray());

理由はわかりませんが、うまくいきます!(なぜこれが機能するのか知っているなら、私は興味があります)

では、よろしくお願いします!

于 2012-11-05T15:28:05.927 に答える