ストリーム経由でクライアントにメッセージを送り返したい。クライアントがこれらのメッセージの処理をできるだけ早く開始することを望みます (サーバーがサーバー側でストリーミングを完了する前に)。
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 シナリオでは機能せず、セルフ ホストの場合にのみ機能するのかについての洞察はありますか? 他に何をする必要がありますか?
この問題の原因として考えられるのは、サービススタックの応答ストリームがバッファリングを使用するように設定されていることです。ただし、これを変更する方法が見つかりません。出来ますか?