2010-07-21 82 views
3

我有一個WCF服務,返回一個帶有Zip文件(50MB)的字節數組給任何請求它的客戶端。如果Zip非常小(比如說1MB),則SOAP響應來自WCF,其中嵌入了字節數組。但即使對於1MB文件,響應大小也非常巨大。如果我嘗試傳輸50MB文件,則服務掛起並拋出內存不足異常,因爲SOAP響應的大小變得很大。如何使用WCF服務通過SOAP將大型Zip文件(50MB)傳輸到任何客戶端?

  1. 什麼是WCF/web服務可用於傳輸大文件(主要是ZIP格式)的最佳選擇,因爲我正在發送一個字節數組。有沒有什麼好的辦法,而不是發回文件?

  2. WCF/web服務是否是將大文件傳輸到任何客戶端的最佳方式,還是有其他更好的選項/技術可用,從而實現10,000個用戶的互操作性和可伸縮性?

我CCODE低於:

 String pathfordownload = @"D:\New Folder.zip"; 
     FileStream F2D = new FileStream(pathfordownload, FileMode.Open,FileAccess.Read); 
     BinaryReader binReader = new BinaryReader(F2D); 
     binReader.BaseStream.Position = 0; 
     byte[] binFile = binReader.ReadBytes(Convert.ToInt32 (binReader.BaseStream.Length)); 
     binReader.Close(); 
     return binFile; 

一個工作片/真實的信息塊會像我跟所有在谷歌提供的數據掙扎,有過去年不會有好結果真的很有幫助周。

回答

4

您可以轉讓Stream through WCF,然後您可以發送(幾乎)無限長度的文件。

2

我遇到了完全相同的問題。內存不足是不可避免的,因爲您使用的是字節數組。

我們所做的就是刷新硬盤上的數據,因此您的虛擬內存不會限制您的併發事務容量,即HD空間。

然後,爲了傳輸,我們將jut文件放在另一臺計算機上。當然在我們的情況下,它是服務器文件傳輸的服務器。如果你想解除對等體的解耦,你可以使用http下載一個文件。

因此,而不是與文件的響應,您的服務可以與一個http url到文件位置響應。然後,當客戶端使用標準HttpRequest或WebClient成功下載服務器時,它會調用刪除文件的方法。在SOAP中可以是Delete(字符串url),在REST中可以是資源上的刪除方法。

我希望這對你有意義。其中最重要的部分是瞭解在可伸縮軟件中,尤其是如果您正在查看10000個客戶端(併發?)時,您可能不會使用有限的資源,如內存流或字節數組。而是依賴於大型且易於擴展的資源,例如最終將在SAN上運行的硬盤分區,並且IT可根據需要增加分區。

+0

我已經嘗試使用RESTFul WCF服務及其工作正常。 – Defendore 2010-09-15 06:04:00

相關問題