【问题标题】:Is it possible to make servicestack use an unbuffered response stream?是否可以让 servicestack 使用无缓冲的响应流?
【发布时间】:2013-10-11 01:58:16
【问题描述】:

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

我已经实现了 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 中托管它时,来自客户端的 get 调用

var client = new ProtoBufServiceClient("");
Stream stream = client.Get(new StreamRequest { HowManySecondsToProduceData = 20};

在 IStreamWriter.WriteTo 调用返回之前不会返回(在上面的示例中为 20 秒)。这会阻止我的客户端立即处理流,并且还会在大量情况下导致失败。我确实在 IStreamWriter.WriteTo 实现中调用了 responseStream.Flush()。

有没有人知道为什么这在 IIS 场景中不起作用,但仅适用于自托管案例?我需要做些什么不同的事情?

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

【问题讨论】:

    标签: iis stream servicestack


    【解决方案1】:

    您只需要禁用 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;
        }
    }
    

    约翰

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        相关资源
        最近更新 更多