WCF ストリーミングに問題があります。私のソリューションには 2 つのコンポーネントがあります。
- Windows サービスでホストされる WCF サービス
- サービスを使用するクライアント アプリケーション (現時点ではコンソール アプリ)
WCF サービスには、RunProcess という 1 つのメソッドしかありません。このメソッドはパラメーターをとらず、プロセスを開始しています。プロセス標準出力ストリーム (StandardOutput.BaseStream) に対応するストリーム (これは WCF ストリーミング メソッドです) を返します。
WCF サービスは、basicHttpBinding (transferMode="streamed") を持つ単一のエンドポイントを公開します。
クライアント コードは非常に単純です。RunProcess メソッドを呼び出し、Stream の結果を StreamReader に渡し、ストリームの最後 (ReadLine() が null を返す) まで ReadLine() を呼び出します。各 ReadLine() の結果はコンソールに送信されます (Console.WriteLine())
したがって、これは非常に簡単です...ただし、クライアントを起動すると、コンソールが期待どおりにすぐに更新されません。なんらかの理由でコンソールに何も表示されずに起動したプロセスが終了するのを待っており、プロセスが完了すると出力が一斉に表示されます。
WCFサービスに依存しない別のコンソールプロジェクトがあり、そこでプロセスを直接起動し、標準の出力ストリームを取得し、まったく同じアルゴリズムを使用してストリームをコンソールに書き込みますが、問題は存在せず、出力ストリームプロセスが起動された直後にリアルタイムで表示されます。
この振る舞いがわかりません。どんな助けでも大歓迎です!
ありがとう。
編集:いくつかのコード/設定が実際に役立つかもしれません。
--- バインディングの構成
<basicHttpBinding>
<binding name="BasicHttpBindingStreamed" maxReceivedMessageSize="67108864" transferMode="Streamed"/>
</basicHttpBinding>
--- WCF方式
public Stream RunProcess()
{
Process p = new Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "XXXXXX";
p.Start();
return p.StandardOutput.BaseStream;
}
--- クライアント消費者
Stream cmdOutputStream = serviceClient.RunProcess();
string currentLine = null;
using (TextReader reader = new StreamReader(cmdOutputStream))
{
currentLine = reader.ReadLine();
while (currentLine != null)
{
Console.WriteLine(currentLine);
currentLine = reader.ReadLine();
}
}