2012-07-16 17 views
1

Live SDK(SkyDrive SDK)的client.UploadAsync方法存在一些问题。我的代码出于某种原因不起作用,或者更具体地说,它上传了一个空文件。它不会抛出任何错误和序列化流的作品(我知道肯定)。Live SDK - 通过内存流上传XML文件

它甚至似乎是记忆流是好的。 (因为我没有工具可以真正看到它中的数据,我只是猜测它可以通过查看它的'Length'属性)。

的UploadAsync方法是细以及或者至少它的工作以及当我第一序列中的数据到一个IsolatedStorage .xml文件然后用IsolatedStorageFileStream读它,然后eventualy发送流。 (然后它上传数据)

任何意见,为什么这可能会发生?

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(); } 
      } 
     } 
    } 

回答

2

你必须调用UploadAsync方法之前,“快退”将MemoryStream到开始。想象一下,记忆流就像是一个记录事物的磁带。 “读/写头”总是在磁带的某个点上浮动,因为您只是将所有序列化的数据写入磁带中,因此这是您的情况的终点。上传方法试图通过在磁带上前进来读取它,意识到它已经到了最后。因此你得到一个空文件上传。

你需要倒带的方法是:

memoryStream.Seek(0, SeekOrigin.Begin); 

而且,使用using指令为IDisposable对象,将MemoryStream是很好的做法。这样你不需要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); 
    } 
} 
+0

我知道“使用”,但我有几个问题,它和异步上传(它只是没有正常工作(我猜它试图处置流很快))。无论如何感谢回答和简单的解释。 – Petrroll 2012-07-17 09:11:27