【问题标题】:Load files in local storage with MvvmCross使用 MvvmCross 在本地存储中加载文件
【发布时间】:2012-11-05 10:18:52
【问题描述】:

目前,我正在尝试使用可移植库中的 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,写入文件会很快停止,并且我的本地文件不完整。如果我尝试只上传一个文件,写入也会停止。 但是,如果我尝试使用 Silverlight(我将 MvvmCross 扩展到 Silverlight),则编写完成。我还没有测试过 MonoDroid 和 MonoTouch。

所以,我的问题是:为什么写作停止了?

【问题讨论】:

    标签: c# windows-runtime mvvmcross


    【解决方案1】:

    我查看了MvxBlockingWinRTFileStoreService.cs 中 WriteFile 的代码,但没有发现任何明显的错误。

    为了对此进行测试,我刚刚使用 https://gist.github.com/4016898 编写了一个快速的独立 WinRT 测试应用程序。

    这完美地保存了 37kB 的 Bing 主页文件。它也适用于您的服务器吗?

    在这个测试之后,我的猜测是您的网络传输代码中可能存在一些错误 - 甚至可能在 localhost 服务中。不过,这个 bug 仍有可能在 StorageFile 保存中。

    一些问题:

    • 能否添加额外的跟踪来找出下载过程中每个阶段报告的数据缓冲区长度?

    • 您能否调整上面的简单测试工具,使其显示相同的结果?


    一个可能的候选人是:

    您使用 ContentLength 作为流长度?您确定这是要使用的正确长度吗?

    例如如果您启用了 GZip 压缩,则 ContentLength 将为您提供传输压缩数据的长度,而不是数据本身的长度 - 请参阅 content-length when using http compression

    我想得越多,这对我来说就越有意义 - Silverlight 将使用浏览器堆栈,与 WinRT 堆栈相比,该堆栈将具有不同的 HTTP 接受标头。


    一些好消息是 async/await 很快就会出现在 MonoTouch 和 MonoDroid 中 - 当它们出现时,我会尝试让文件 API 都可以作为 async 和 await 使用。

    【讨论】:

      【解决方案2】:

      斯图尔特,

      首先,感谢您的回答!

      我尝试了您的示例并适应了我的情况(通过 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());
      

      我不知道为什么,但它有效! (如果你知道为什么会这样,我很感兴趣)

      所以,谢谢你的帮助!

      【讨论】:

      • 查看我的答案 - 它在粗体评论中 - ContentLength 不是解压缩的流长度。 PS 我们希望您的 Silverlight 端口公开 :)
      • 斯图尔特,我来找你关于 Mvvmcross Silverlight 的改编。我可以让您的电子邮件地址将代码发送给您吗?我不使用 GitHub ......当你有代码时,我有一个关于内存泄漏的问题;)谢谢!
      • 虽然如果你在 StackOverflow 中点击我的名字,那里面也有一些提示 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多