2012-08-10 84 views
1

我有一個流式WCF服務。在一個操作中,我收到一個文件,用於上傳目的。 如果我嘗試做這樣的事情WCF流/郵件大小

request.FileContent.Length 

然後我收到OperationNotSupported例外。沒關係。 但是我怎樣才能得到文件的大小,而實際上並沒有完全轉移它? 我知道我可以將這些信息與呼叫一起作爲標題發送,但我不想這樣。

如果WCF能夠通過maxReceiveMessageSize限制請求大小。我如何使用相同的信息來檢查消息/流的大小?

回答

1

一般來說,如果不讀取所有字節並計算字節數,就無法知道字節流的大小,除非在數據流開始處有數據,它告訴您整個數據流中有多少字節,或者一些其他帶外方式來傳遞流的長度,例如在WCF消息頭中。如果您想知道大小而不讀取流,則必須使用Header方法。

WCF maxReceiveMessageSize通過計數收到的字節數來工作,並在超出限制時拋出異常......它也不知道流的長度,也不能先發制人地阻止消息被接收沒有先讀取允許的最大字節數。

1

但是我怎樣才能得到文件的大小,而沒有實際上完全轉移它?我知道我可以將這些信息與呼叫一起作爲標題發送,但我不想這樣。

您將不得不首先發送字節流的大小,首先沒有其他方式。 (如果有一些內在的方式就是所有這將是無論如何做)

它不會增加太多的複雜性,它前面加上到流:

var bytes = File.ReadAllBytes("somefile.txt"); 
stream.Write(BitConverter.GetBytes((Int32)bytes.Length), 0, 4); 
stream.Write(bytes, 0, bytes.Length); 

,然後在另一側讀取流時:

byte[] fileLengthBytes =new byte[4]; 
stream.Read(fileLengthBytes, 0, 4); 
int length = BitConverter.ToInt32(fileLengthBytes, 0); 
//you know the size of the file now, log it or show the user 
var fileBytes = new byte[length]; 
stream.Read(fileBytes, 0, fileBytes.Length); 

這僅僅是一個例子 - 你可能不希望創建一個byte[]緩衝區,如果你的流大。