3

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

我已经实现了 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 响应流设置为使用缓冲。我找不到改变这种情况的方法。可能吗?

4

2 回答 2

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;
    }
}

约翰

于 2013-10-10T17:58:16.627 回答
2

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

于 2013-10-10T12:48:49.500 回答