我想通过流将消息发送回客户端。我希望客户端尽快开始处理这些消息(在服务器完成服务器端的流式传输之前)。
我已经实现了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响应流被设置为使用缓冲。我找不到改变这种方法的方法。有可能吗?
答案 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。