用于进程输出流的wcf basichttpbinding流不能按预期工作

时间:2012-06-01 22:54:22

标签: c# wcf process streaming basichttpbinding

我遇到了WCF流媒体的问题。 我的解决方案中有两个组件:

  • Windows服务中托管的WCF服务
  • 使用服务的客户端应用程序(现在是控制台应用程序)

WCF服务只有一个方法:RunProcess。此方法不带参数,并且正在启动一个过程。它返回一个Stream(这是一个WCF流方法),对应于进程标准ouptut流(StandardOutput.BaseStream)。

WCF服务使用basicHttpBinding公开单个端点(使用transferMode ="流式传输")。

客户端代码非常简单,它调用RunProcess方法并将Stream结果传递给StreamReader,在其上调用ReadLine()直到流结束(ReadLine()返回null)。每个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();
    }
 }

1 个答案:

答案 0 :(得分:2)

解决了......愚蠢的问题,我在WCF服务器端配置上指定了transferMode =“Streamed”但忘记了客户端。