编辑:使用流式传输模式时,WCF似乎在内部缓冲16K。只有在从流中读取了这些16K后,WCF才会发送任何内容。有没有办法将其配置为较低的数字? (对于convrete示例,请参阅下面的代码)。
我想知道是否可以限制WCF在开始发送之前从返回的流中读取的字节数。 maxBufferSize
属性似乎不限制此。基本上我有以下情况:
App.config中:
<services>
<service name="WcfStreaming.Service">
<endpoint address="/rest" binding="webHttpBinding" bindingConfiguration="streamedHttpBinding" contract="WcfStreaming.IService" behaviorConfiguration="RESTBehaviour"/>
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="streamedHttpBinding" transferMode="Streamed" maxBufferSize="256"/>
</webHttpBinding>
</bindings>
合同:
[ServiceContract]
public interface IService
{
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/data")]
Stream GetData();
}
服务实施:
public class Service : IService
{
public Stream GetData()
{
return new DelayStream();
}
}
DelayStream
:
public class DelayStream : Stream
{
private int number = 0;
public DelayStream()
{
}
public override bool CanRead
{
get { return true; }
}
public override int Read(byte[] buffer, int offset, int count)
{
int nc = 64;
for (int i = 0; i < nc; i++)
{
byte[] b = BitConverter.GetBytes(number++);
Buffer.BlockCopy(b, 0, buffer, offset + (i * sizeof(int)), sizeof(int));
}
Thread.Sleep(1500);
return nc * sizeof(int);
}
// ... other Stream methods
}
会发生什么:
WCF首先尝试从流中读取256个字节,然后在实际发送任何内容之前继续读取4096个字节。如果我使用Thread.Sleep
运行它(模拟花费很长时间来获取数据),它需要很长时间才能真正开始发送任何内容。
在发送任何内容之前似乎是尝试读取16K,但我将缓冲区大小设置为256.难道这不是说它应该读取256个字节然后发送吗?
或者有人知道如何强制WCF立即开始发送数据吗?
谢谢,尤利安