WCF流:最后一个字节丢失
我有一个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
[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,但遇到了与您的示例相同的问题。出于某种原因,它需要一个更大的缓冲区。似乎一个比明显需要的大两个字节的缓冲区是关键。你的猜测和我的一样好。事情变得越来越奇怪:)谢谢你的回答,我真的很想知道为什么会发生这种事。希望有人能帮我解决这个问题。