2012-08-07 55 views
3

我有一個WCF服務,它使用Stream類上傳文檔。查找WCF客戶端中的Stream對象的長度?

現在在此之後,我想獲得的文件(流的長度)的大小,更新fileAttribute的文件大小。

但這樣做,WCF拋出一個異常說

Document Upload Exception: System.NotSupportedException: Specified method is not supported. 
    at System.ServiceModel.Dispatcher.StreamFormatter.MessageBodyStream.get_Length() 
    at eDMRMService.DocumentHandling.UploadDocument(UploadDocumentRequest request) 

誰能幫我解決這個。

+0

你應該從客戶端發送'長度'。 – 2012-08-07 14:52:09

+0

我無法從客戶端發送文件大小,因爲是這個 – 2012-08-07 14:55:18

回答

6

現在,在此之後,我想獲得文檔的大小流),以更新FileSize的fileAttribute。

不,不這樣做。如果你正在寫一個文件,那麼只需寫入文件。在最簡單的:

using(var file = File.Create(path)) { 
    source.CopyTo(file); 
} 

或之前4.0:

using(var file = File.Create(path)) { 
    byte[] buffer = new byte[8192]; 
    int read; 
    while((read = source.Read(buffer, 0, buffer.Length)) > 0) { 
     file.Write(buffer, 0, read); 
    } 
} 

(這並不需要預先知道的長度)

需要注意的是一些WCF選項(完整的郵件安全等)需要整個消息處理之前進行驗證,所以絕不能真正流,因此:如果大小是巨大的,我建議你改用在客戶端將其分解,並在碎片並將其發送(你再重新組裝在服務器的API )。

+0

我無法使用.net 4.0,我正在使用3.5 – 2012-08-07 15:15:41

+0

如果您沒有'CopyTo',那麼實現您自己的'byte [] buffer = new byte [4096]; for(int byteCount = source.Read(buffer,0,4096); byteCount!= 0; byteCount = source.Read(buffer,0,4096)file.Write(buffer,0,byteCount);'4096是一個內存頁面大小,所以它往往做得很好,你不想超出最多兩倍,或者你正在浪費內存,沒有收益。 – 2012-08-07 15:20:14

+1

@ TheIndianProgrammmer(嘆氣)以及約4行代碼手動執行.. 。一個時刻... – 2012-08-07 15:20:43

0

如果流不支持查找使用Stream.Length

另一種選擇是在流複製到一個字節數組,並找到其累計長度不能找到它的長度。這涉及到首先處理整個流,如果你不想這樣做,你應該添加一個流長度參數到你的WCF服務接口

+0

得到的byte []沒有專門的物業重過程,如果文件大小是大 – 2012-08-07 14:54:52

+0

@TheIndianProgrammmer這也正是爲什麼你應該把它作爲一個'Stream',P你不」噸需要知道這樣做的長度。或者:調用者可以將文件分塊並將其發送多個部分。 – 2012-08-07 15:06:04

+0

準確地說,如果你打算把它作爲一個文件保存下來,你在意什麼尺寸是什麼?您一次不想在內存中使用超過4-8k的塊。 如果您想設置最大文件大小,請通過複製到最大值來完成,然後刪除文件並在您點擊文件時中止。 – 2012-08-07 15:21:58