是否可以使servicestack使用无缓冲的响应流?

时间:2013-10-04 10:57:15

标签: iis stream servicestack

我想通过流将消息发送回客户端。我希望客户端尽快开始处理这些消息(在服务器完成服务器端的流式传输之前)。

我已经实现了IStreamWriter,并且我有一个返回IStreamWriter实现的服务。

public class StreamingService : Service
{
    public object Any(MyStreamRequest request)
    {
        return new MyStreamWriter(request);
    }
}

MyStreamRequest的定义如下:

[DataContract]
public class StreamRequest : IReturn<Stream>
{
    [DataMember]
    public int HowManySecondsToProduceData { get; set; }
}

当我在自托管环境中测试我的实现时,它可以很好地工作。但是,当我在IIS中托管它时,来自客户端的调用

var client = new ProtoBufServiceClient("");
Stream stream = client.Get(new StreamRequest { HowManySecondsToProduceData = 20};
在IStreamWriter.WriteTo调用返回(上面的示例中为20秒)之前,

不会返回。这可以防止我的客户端立即处理流,并且还会导致大量情况下的故障。我在我的IStreamWriter.WriteTo实现中调用responseStream.Flush()。

是否有人了解为什么这在IIS方案中不起作用,但仅针对自托管案例?我需要做些什么不同的事情?

似乎这个问题的一个可能原因是servicestack响应流被设置为使用缓冲。我找不到改变这种方法的方法。有可能吗?

2 个答案:

答案 0 :(得分:3)

您只需要禁用ASP.Nets响应缓冲:

public class NoBufferAttribute : RequestFilterAttribute
{
    public override void Execute( IHttpRequest req, IHttpResponse res, object requestDto )
    {
        var originalResponse = (System.Web.HttpResponse)res.OriginalResponse;
        originalResponse.BufferOutput = false;
    }
}

约翰

答案 1 :(得分:2)

我自己找到了一个解决方案:这个问题的解决方案非常简单:当你想将数据发送到客户端时,在IStreamWriter.WriteTo实现中调用IHttpResponse Flush()。通过在Service实现中调用base.Response来获得IHttpResponse。