在发送任何内容之前,WCF流传输缓冲区为16K

时间:2014-10-20 08:19:51

标签: c# wcf

编辑:使用流式传输模式时,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立即开始发送数据吗?

谢谢,尤利安

0 个答案:

没有答案