我有一個流式WCF服務。在一個操作中,我收到一個文件,用於上傳目的。 如果我嘗試做這樣的事情WCF流/郵件大小
request.FileContent.Length
然後我收到OperationNotSupported例外。沒關係。 但是我怎樣才能得到文件的大小,而實際上並沒有完全轉移它? 我知道我可以將這些信息與呼叫一起作爲標題發送,但我不想這樣。
如果WCF能夠通過maxReceiveMessageSize限制請求大小。我如何使用相同的信息來檢查消息/流的大小?
我有一個流式WCF服務。在一個操作中,我收到一個文件,用於上傳目的。 如果我嘗試做這樣的事情WCF流/郵件大小
request.FileContent.Length
然後我收到OperationNotSupported例外。沒關係。 但是我怎樣才能得到文件的大小,而實際上並沒有完全轉移它? 我知道我可以將這些信息與呼叫一起作爲標題發送,但我不想這樣。
如果WCF能夠通過maxReceiveMessageSize限制請求大小。我如何使用相同的信息來檢查消息/流的大小?
一般來說,如果不讀取所有字節並計算字節數,就無法知道字節流的大小,除非在數據流開始處有數據,它告訴您整個數據流中有多少字節,或者一些其他帶外方式來傳遞流的長度,例如在WCF消息頭中。如果您想知道大小而不讀取流,則必須使用Header方法。
WCF maxReceiveMessageSize通過計數收到的字節數來工作,並在超出限制時拋出異常......它也不知道流的長度,也不能先發制人地阻止消息被接收沒有先讀取允許的最大字節數。
但是我怎樣才能得到文件的大小,而沒有實際上完全轉移它?我知道我可以將這些信息與呼叫一起作爲標題發送,但我不想這樣。
您將不得不首先發送字節流的大小,首先沒有其他方式。 (如果有一些內在的方式就是所有這將是無論如何做)
它不會增加太多的複雜性,它前面加上到流:
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[]
緩衝區,如果你的流大。