2013-02-10 1 views
1

J'ai une application serveur qui EXEC une autre application, cette deuxième application construit un fichier journal, et je veux que le serveur l'envoie à un client via WCF.streaming un fichier pendant qu'il est écrit dans WCF

Je souhaite que le client lise le journal pendant que l'application EXEC le met à jour.

J'ai utilisé un contrat d'opération qui renvoie un flux (le fichier journal). le problème est que lorsque j'envoie le flux, le journal est toujours vide, et le client ne voit pas la "mise à jour" que le serveur EXEC écrit.

ici est le code du serveur:

public Stream GetLog() 
    { 
     Stream stream = new FileStream(@"Log.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
     return stream; 
    } 

l'EXEC du serveur est en train d'écrire simplement le fichier "Log.txt"

est ici le code client:

 public void SaveLog() 
    { 
     Stream stream = ServerProxy.GetLog(); 
     StreamWriter writer = new StreamWriter("NEWLog.txt"); 
     writer.AutoFlush = true; 
     StreamReader reader = new StreamReader(stream); 
     char[] buf = new char[100]; 
     int count = 0; 
     while (count = reader.ReadBlock(buf, 0, 100) > 0) 
     { 
      writer.Write(buf, 0, count); 
     } 
     stream.Close(); 
     writer.Close(); 
    } 

comment puis-je mettre à jour le client avec le journal en temps réel?

+0

Comment êtes-vous la lecture du fichier journal dans le client? Vous montrez seulement comment vous l'ouvrez. –

+0

J'ai un lecteur de flux .. son écrit dans le code client .. – IsraelKo

+0

Il serait utile si vous avez inclus votre code que ce commentaire n'aide pas à expliquer plus clairement pourquoi votre logique ne fonctionne pas. –

Répondre

1

Je pense que vos fixations sont fausses. vous devez définir votre transferMode="Streamed"

là, vous pouvez trouver un exemple:

http://msdn.microsoft.com/en-us/library/ms751463.aspx

+0

J'ai utilisé ce paramètre, mais toujours le flux client n'a pas mis à jour avec les modifications par le flux du serveur. – IsraelKo

+0

@IsraelKo essaie d'utiliser basicHttpBinding – giammin

0

Il y a deux possibilités. Etes-vous autorisé à modifier le contrat? Si vous pouvez utiliser une liaison prenant en charge la session comme netTcpBinding, vous pouvez modifier votre contrat pour utiliser un contrat de rappel dans lequel le rappel est utilisé pour publier de nouvelles données de journal.

[ServiceContract] 
public interface ILogCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void NewLog(string logString); 
} 

[ServiceContract(CallbackContract = typeof(ILogCallback))] 
public interface ILog 
{ 
    /// Call this method to sign up for future log messages, 
    /// which will be sent to the callback NewLog. 
    [OperationContract] 
    void SignMeUpForLogs(); 
} 

Quel type de fixations pouvez-vous utiliser? Les sessions sont-elles une alternative viable ou devez-vous utiliser PerCall?

Cordialement, Fredrik

+0

J'utilise NetTcpBinding, et votre solution résout vraiment le problème, mais l'implémentation est compliquée pour stocker tous les abonnés qui veulent le journal, et utiliser le thread pour attraper les changements dans le fichier journal et mettre à jour tous les abonnés. Je serai heureux si mon code simple fonctionne. – IsraelKo