我希望以非常低比特率连续流式传输数据:每秒几个字节。
当我传输大量数据时,我的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()
由于
答案 0 :(得分:1)
您可以通过返回IEnumerable字节数组而不是流来解决缓冲问题,并且每次都发送一个[1024]或更少的字节。
答案 1 :(得分:0)
我得到了MS的回答。该流由16ko / 32ko chrunk发送。这种行为是“按设计”。
更多信息: http://social.msdn.microsoft.com/Forums/en/wcf/thread/0662dc2e-6468-47c5-9676-fa14a56121cb