2012-06-01 1 views
1

J'ai un problème avec le streaming WCF. J'ai deux composants dans ma solution:wcf basichttpbinding streaming pour le flux de sortie du processus ne fonctionne pas comme prévu

  • Un service WCF hébergé dans un service Windows
  • Une application client (application de la console pour l'instant) consommer le service

Le service WCF ont juste un méthode: RunProcess. Cette méthode ne prend aucun paramètre et démarre un processus. Il renvoie un Stream (il s'agit d'une méthode de streaming WCF) correspondant au flux standard ouptut du processus (StandardOutput.BaseStream).

Le service WCF expose un seul point de terminaison avec un basicHttpBinding (avec transferMode = "streamed"). Le code client est assez simple, il appelle les méthodes RunProcess et transmet le résultat du Stream dans un StreamReader appelant ReadLine() jusqu'à la fin du flux (ReadLine() retournant null). Chaque résultat ReadLine() est envoyé à la console (Console.WriteLine())

Donc, c'est assez simple ... Cependant, quand je lance le client, la console n'est pas rafraîchi immédiatement comme prévu. Il attend une raison pour que le processus qui a été lancé se termine parce que rien ne s'affiche dans la console depuis longtemps, et une fois le processus terminé, il affiche la sortie tout à la fois.

J'ai un autre projet de console, ne comptant pas sur le service WCF, où je lance le processus directement, obtiens le flux standard ouptput, et utilise le même algorithme, écris le flux sur la console, et le problème n'est pas présent , le flux de sortie est affiché directement après le lancement du processus, en temps réel.

Je ne comprends pas ce comportement. Toute aide serait grandement appréciée!

Merci.

EDIT: Certains codes/config peuvent en effet aider.

--- Config de la liaison

<basicHttpBinding> 
    <binding name="BasicHttpBindingStreamed" maxReceivedMessageSize="67108864" transferMode="Streamed"/>   
</basicHttpBinding> 

--- méthode 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;    
    } 

--- client CONSOMMATEUR

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

Peut-être poster des fichiers de code et de configuration peut aider. – Bernard

Répondre

2

Résolu ... question stupide, je a spécifié le transferMode = "Streamed" sur la configuration côté serveur WCF mais a oublié le côté client.

Questions connexes