Live SDK(SkyDrive SDK)的client.UploadAsync
方法存在一些问题。我的代码由于某种原因不起作用,或者更具体地说它上传了一个空文件。它没有抛出任何错误,序列化流工作(我肯定知道)。
甚至看起来Memory Memory也行。 (因为我没有工具可以真正看到其中的数据,我只是想通过查看它的'长度'属性就可以了。)
UploadAsync方法也很好,或者至少它在我第一次将数据序列化为IsolatedStorage中的.xml文件然后使用IsolatedStorageFileStream读取它然后最终发送该流时效果很好。 (然后它上传了数据)
有关为何可能发生这种情况的任何建议?
public void UploadFile<T>(string skyDriveFolderID, T data, string fileNameInSkyDrive)
{
this.fileNameInSkyDrive = fileNameInSkyDrive;
{
try
{
memoryStream = new MemoryStream();
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
{
serializer.Serialize(xmlWriter, data);
}
client.UploadAsync(skyDriveFolderID, fileNameInSkyDrive, true, memoryStream, null);
}
catch (Exception ex)
{
if (memoryStream != null) { memoryStream.Dispose(); }
}
}
}
答案 0 :(得分:2)
在调用UploadAsync
方法之前,您必须将内存流“回放”到开头。想象一下,内存流就像是一个录制内容的磁带。 “读/写头”总是浮动在磁带的某个点上,这就是你的情况的结束,因为你只是将所有序列化数据写到它上面。上传方法试图通过在磁带上向前移动来读取它,意识到它已经在它的末尾。因此,您上传了一个空文件。
倒带所需的方法是:
memoryStream.Seek(0, SeekOrigin.Begin);
此外,对于内存流所用的using
个对象,最好使用IDisposable
指令。这样您就不需要try {...} finally { ...Dispose(); }
(这由using
完成。)
您的方法可能如下所示:
public void UploadFile<T>(string skyDriveFolderID, T data, string fileNameInSkyDrive)
{
this.fileNameInSkyDrive = fileNameInSkyDrive;
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (var memoryStream = new MemoryStream())
{
using (var xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
{
serializer.Serialize(xmlWriter, data);
}
memoryStream.Seek(0, SeekOrigin.Begin);
client.UploadAsync(skyDriveFolderID, fileNameInSkyDrive, true, memoryStream, null);
}
}