使用RESTful WCF服务以低比特率进行流式传输

时间:2011-02-18 12:26:57

标签: c# .net wcf rest streaming

我希望以非常低比特率连续流式传输数据:每秒几个字节。

当我传输大量数据时,我的WCF REST服务正常工作。但是当比特率很低时,似乎流被缓冲,直到有足够的数据传递到传输层。

因此,我每16秒收到16Ko数据,而不是每秒收到1Ko。

如何在WCF REST中实现低比特率流?

我的WCF服务:

void StartMyWCFService()
{ 
    host = new WebServiceHost(typeof(IServ), new Uri("http://localhost:4530/");
    var bnd = new WebHttpBinding();
    bnd.TransferMode = TransferMode.Streamed;
    host.AddServiceEndpoint(typeof(IServ), bnd, "");
    host.Open();
}


[ServiceContract]
public interface IServ
{
    [OperationContract, WebGet(UriTemplate = "/")]
    Stream MyStream();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class Serv : IServ
{
    public Stream MyStream()
    {
        var resp = WebOperationContext.Current.OutgoingResponse;
        resp.StatusCode = System.Net.HttpStatusCode.OK;
        return _new MyStream();
    }
}

class MyStream : Stream
{
    public override int Read(byte[] buffer, int offset, int count)
    {
        // returns a few bytes every second
    }
    [...]
}

编辑:我注意到.net框架内的16Ko硬编码缓冲区大小(v4)位于: System.ServiceModel.dll#System.ServiceModel.Channels.HttpOutput.WriteStreamedMessage()

由于

2 个答案:

答案 0 :(得分:1)

您可以通过返回IEnumerable字节数组而不是流来解决缓冲问题,并且每次都发送一个[1024]或更少的字节。

答案 1 :(得分:0)

我得到了MS的回答。该流由16ko / 32ko chrunk发送。这种行为是“按设计”。

更多信息: http://social.msdn.microsoft.com/Forums/en/wcf/thread/0662dc2e-6468-47c5-9676-fa14a56121cb