2012-08-10 27 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[]缓冲区,如果你的流大。