2012-06-01 3 views
1

WCF 스트리밍에 문제가 있습니다.wcf basichttpbinding 프로세스 출력 스트림에 대한 스트리밍이 예상대로 작동하지 않습니다.

  • 서비스

WCF 서비스를 소비 (지금은 콘솔 응용 프로그램) Windows 서비스

  • 클라이언트 응용 프로그램에서 호스팅되는 WCF 서비스가 하나있다 : 나는 내 솔루션의 두 가지 구성 요소가 메서드 : RunProcess. 이 메소드는 매개 변수를 취하지 않고 프로세스를 시작합니다. 프로세스 표준 스트림 (StandardOutput.BaseStream)에 해당하는 Stream (WCF 스트리밍 메서드)을 반환합니다.

    WCF 서비스는 basicHttpBinding (transferMode = "streamed")을 사용하여 단일 종점을 제공합니다.

    클라이언트 코드는 매우 간단합니다. RunProcess 메서드를 호출하고 스트림 결과가 스트림 끝 (ReadLine()이 null을 반환 할 때)까지 ReadLine()을 호출하는 StreamReader에 전달합니다. 각 ReadLine() 결과는 콘솔 (Console.WriteLine())에 전송됩니다.

    이렇게 간단합니다 ... 그러나 클라이언트를 시작하면 콘솔이 예상대로 즉시 새로 고쳐지지 않습니다. 오랜 시간 동안 콘솔에 아무것도 표시되지 않기 때문에 프로세스를 끝내기 위해 어떤 이유로 기다리고 있습니다. 프로세스가 완료되면 즉시 출력을 모두 표시합니다.

    다른 콘솔 프로젝트가 있습니다. WCF 서비스에 의존하지 않고 프로세스를 직접 실행하고 표준 출력 스트림을 얻은 다음 똑같은 알고리즘을 사용하여 콘솔에 스트림을 쓰고 문제가 없습니다. , 출력 스트림은 프로세스가 시작된 직후에 실시간으로 표시됩니다.

    이 동작을 이해하지 못합니다. 어떤 도움이라도 대단히 감사하겠습니다!

    감사합니다.

    편집 : 일부 코드/config 실제로 도움이 될 수 있습니다. 바인딩

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

    --- 클라이언트 consummer

    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

    아마도 일부 코드 및 구성 파일을 게시하면 도움이 될 수 있습니다. – Bernard

    답변

    2

    해결 ... 바보 문제, I WCF 서버 쪽 구성에서 transferMode = "Streamed"를 지정했지만 클라이언트 측은 잊어 버렸습니다.