C# 使用MvvmCross在本地存储中加载文件

C# 使用MvvmCross在本地存储中加载文件,c#,windows-runtime,mvvmcross,C#,Windows Runtime,Mvvmcross,目前,我正在尝试使用便携库中的web服务从服务器上载文件。对于每个文件,我都做了如下操作: WebRequest request = WebRequest.Create("http://localhost:49364/" + url); request.BeginGetResponse((aResult) => { var retour = aResult.AsyncState as WebRequest; WebResponse reponse = reto

目前,我正在尝试使用便携库中的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);
在我的回调方法中,我这样做:

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


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

我在中查看了WriteFile的代码,但没有看到任何明显的错误

为了测试这一点,我刚刚使用编写了一个快速的独立WinRT测试应用程序

这完美地保存了37kB的Bing主页文件。它在您的服务器上也工作吗

在这个测试之后,我猜测您的web传输代码中可能存在一些错误,甚至可能是在localhost服务中。但是,仍然有可能是StorageFile保存中存在该缺陷

一些问题:

  • 您是否可以添加额外的跟踪以了解在下载的每个阶段报告的数据缓冲区长度

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


一个可能的候选人是:

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

e、 g.如果您启用了GZip压缩,那么ContentLength将为您提供传输的压缩数据的长度,而不是数据本身的长度-请参阅

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


一些好消息是,async/await很快就会出现在MonoTouch和MonoDroid上,当它们出现时,我将尝试使文件API都以async和await的形式提供。

Stuart

首先,谢谢你的回答

我尝试了你的例子并适应了我的情况(通过web服务从服务器上传文件),开始一切都正常。所有文件都已正确上载。 但当我添加图片上传时,我也遇到了同样的问题。图像文件和文本文件不完整

但是看看你例子的代码,我找到了一个解决方案,虽然我真的不明白问题在哪里

对于编写作品,我(在回调方法中)替换了以下内容:

据此:

...

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中单击我的名字,那么其中也有一些提示;)