1

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

request.FileContent.Length

然后我收到一个 OperationNotSupported 异常。没关系。但是我怎么能在不完全传输文件的情况下获得文件大小呢?我知道我可以将这些信息与呼叫一起作为标头发送,但我不想这样。

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

4

2 回答 2

1

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

WCF maxReceiveMessageSize 通过计算接收到的字节数并在超出限制时抛出异常来工作......它也不知道流长度,并且不能在没有先读取的情况下预先阻止接收消息最大允许字节数。

于 2012-08-10T13:05:12.867 回答
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[]-如果您的流很大,您可能不想创建缓冲区。

于 2012-08-10T13:37:16.273 回答