WCF流/消息大小

时间:2012-08-10 12:53:51

标签: wcf

我有一个流式WCF服务。在一个操作中,我收到一个文件,用于上传目的。 如果我尝试做这样的事情

request.FileContent.Length

然后我收到一个OperationNotSupported异常。没关系。 但是如何在不实际完全转移文件的情况下获取文件大小? 我知道我可以将这些信息与电话一起作为标题发送,但我不想这样做。

如果WCF能够通过maxReceiveMessageSize限制请求大小。如何使用相同的信息检查消息/流大小?

2 个答案:

答案 0 :(得分:1)

一般情况下,除非在流的开头有数据告诉您整个流中有多少字节,否则无法在不读取所有字节流和计算字节数的情况下知道字节流的大小,或者一些其他带外方式来传递流的长度,例如在WCF消息头中。如果您想在不阅读流的情况下知道大小,则必须使用Header方法。

WCF maxReceiveMessageSize通过计算接收到的字节来计算,如果超出限制则抛出异常...它也不知道流长度,并且不能先发生意外地阻止接收消息首先读取允许的最大字节数。

答案 1 :(得分: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[]缓冲区。