WCF流:最后一个字节丢失

WCF流:最后一个字节丢失,wcf,streaming,Wcf,Streaming,我有一个WCF服务,它有一个返回流的方法 [ServiceContract] public interface IService1 { [OperationContract] MyMessage Test(); } 现在,MyMessage的定义如下: [MessageContract] public class MyMessage { public MyMessage(string file) { this.Stream = File.Ope

我有一个WCF服务,它有一个返回流的方法

[ServiceContract]
public interface IService1
{
    [OperationContract]
    MyMessage Test();
}
现在,
MyMessage
的定义如下:

[MessageContract]
public class MyMessage
{
    public MyMessage(string file)
    {
        this.Stream = File.OpenRead(file);
        this.Length = Stream.Length;
    }

    [MessageHeader]
    public long Length;

    [MessageBodyMember]
    public Stream Stream;
}
桃色。

该服务使用
basicHttpBinding
进行流式响应。这是绑定配置:

  <basicHttpBinding>
    <binding name="BasicStreaming"
             maxReceivedMessageSize="67108864" maxBufferSize="65536" transferMode="StreamedResponse" />
  </basicHttpBinding>
我肯定我遗漏了什么,但有人能告诉我为什么会发生这种情况吗?最大的问题是,在另一个服务中,无论我以何种方式读取流,我都会丢失最后一个字节,但也许通过在这里识别问题,我也可以解决这个问题。 技术细节:

  • IIS 7.0
  • .NET 3.5
  • 基本HTTP绑定
  • 流式响应模式

注意:我已经上传了隔离问题的项目,因此任何人都可以尝试:

为什么要通过计数(长度+1)?它应该是长度,否则您试图读取比可用字节多一个字节。

为什么要传递(长度+1)的计数?它应该是长度,否则您试图读取比可用字节多一个字节。

我没有确切的答案来解释为什么这样做(我的大脑目前还没有完全投入),但是这样做是可行的:

var buffer1 = new byte[length+2];
stream1.Read(buffer1, 0, buffer1.Length);
(是的,你最终得到的缓冲区太大了。这只是进一步思考的起点)


在测试中,我发现+1不够大,但+2足够大

我没有一个确切的答案来解释为什么会这样(我的大脑目前还没有完全投入),但是这确实有效:

var buffer1 = new byte[length+2];
stream1.Read(buffer1, 0, buffer1.Length);
(是的,你最终得到的缓冲区太大了。这只是进一步思考的起点)


在测试中,我发现+1不够大,但+2足够大

对不起,我忘记编辑了,这只是我试过的东西。当尝试使用长度时出现问题。对不起,我忘记编辑它,这只是我尝试过的东西。在尝试使用长度时会出现问题。值得一提的是,我尝试将缓冲区的大小设置为13,并将读取长度设置为13,但遇到了与您的示例相同的问题。出于某种原因,它需要一个更大的缓冲区。似乎一个比明显需要的大两个字节的缓冲区是关键。你的猜测和我的一样好。事情变得越来越奇怪:)谢谢你的回答,我真的很想知道为什么会发生这种事。希望有人能帮我解决这个问题。我尝试将缓冲区的大小设置为13,读取长度设置为13,但遇到了与您的示例相同的问题。出于某种原因,它需要一个更大的缓冲区。似乎一个比明显需要的大两个字节的缓冲区是关键。你的猜测和我的一样好。事情变得越来越奇怪:)谢谢你的回答,我真的很想知道为什么会发生这种事。希望有人能帮我解决这个问题。