2012-11-05 37 views
2

目前,我試圖使用便攜式庫中的Web服務從服務器上載文件。對於每一個文件,我有這樣的:使用MvvmCross在本地存儲中加載文件

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。

所以,我的問題是:爲什麼寫作停止?

回答

2

我已經瀏覽了MvxBlockingWinRTFileStoreService.cs的WriteFile的代碼,我看不到任何明顯的錯誤。

爲了測試這個,我剛剛使用https://gist.github.com/4016898寫了一個快速獨立的WinRT測試應用程序。

這可以完美保存37kB的Bing主頁文件。它也可以在你的服務器上工作嗎?

經過此測試後,我的猜測是,您的web傳輸代碼中可能存在一些錯誤 - 甚至可能在localhost服務中。但是,該錯誤仍然存​​在於StorageFile中。

一些問題:

  • 你可以添加額外的跟蹤來找出在你下載的每一個階段所報告的數據緩衝區長度?

  • 您能否調整上面的簡單測試裝置,使其顯示相同的結果?


一個可能的候選人是:

您正在使用的ContentLength作爲流長度?你確定這是正確的長度嗎?

例如如果啓用了GZip壓縮,那麼ContentLength會給你傳輸的壓縮數據的長度,而不是數據本身的長度 - 請參閱content-length when using http compression

我越想到它,這對我來說越有意義--Silverlight將會使用瀏覽器堆棧,與WinRT堆棧相比,它將具有不同的HTTP Accept頭。


一些好消息是,異步/ AWAIT即將推出MonoTouch的到和MonoDroid的 - 當他們這樣做,然後我將努力使該文件API的所有可用的異步和等待。

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

我不知道爲什麼,但它的工程! (如果你知道爲什麼這個工程,我感興趣)

所以,謝謝你的幫助!

+0

看到我的答案 - 它在大膽的評論 - ContentLength不解壓縮流長度。 PS我們希望你的silverlight端口在公開:) – Stuart

+0

斯圖爾特, 我來找你對Mvvmcross Silverlight的改編。我可以用你的電子郵件地址向你發送代碼嗎?我不使用GitHub ... 而當你有代碼時,我有一個關於內存泄漏的問題;) 謝謝! – Titecarma

+0

最好的聯繫方式在http://slodge.blogspot.co.uk/p/if-youve-got-questions.html – Stuart

相關問題