2013-02-10 15 views
1

HES我有誰EXEC另一個應用程序,該應用程序第二建立一個日誌文件, 我希望服務器通過WCF其發送到客戶端服務器應用程序流的文件。同時寫在WCF

我希望客戶端在EXEC應用程序更新它時讀取日誌。

我已經使用了返回流的操作契約(日誌文件)。 問題是,當我第一次發送流時,日誌仍然是空的, 和客戶端沒有看到服務器EXEC寫入的「更新」。

這裏是服務器代碼:

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

從服務器EXEC簡單地寫入 「log.txt的」 文件

這裏是客戶端代碼:

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

如何使用REAL-TIME登錄來更新客戶端?

+0

你是如何從客戶端的日誌文件中讀取?你只會展示你如何打開它。 – 2013-02-10 17:14:21

+0

我有一個流閱讀器.. 書面客戶端代碼.. – IsraelKo 2013-02-10 17:16:18

+0

這將幫助,如果你提供你的代碼爲註釋並不能幫助任何解釋更清楚爲什麼你的邏輯是行不通的。 – 2013-02-10 17:17:15

回答

1

我認爲你的綁定是錯誤的。 你應該設置你的transferMode="Streamed"

那裏你可以找到一個例子:

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

+0

我已經使用這個設置,但客戶端流仍然沒有更新服務器流的更改。 – IsraelKo 2013-02-10 20:29:41

+0

@IsraelKo嘗試使用basicHttpBinding的 – giammin 2013-02-11 09:17:46

0

有一對夫婦的可能性。 您可以修改合同嗎?如果您可以使用類似netTcpBinding的會話感知綁定,那麼您可以修改您的合同以使用回調協議,其中回調用於發佈新的日誌數據。

[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(); 
} 

什麼樣的綁定可以使用?會話是否可行,或者您是否需要使用PerCall?

問候, 弗雷德裏克

+0

我使用NetTcpBinding的,和你的解決方案是真正解決問題,但實現複雜的跳槽來存儲所有用戶想要的日誌和操作線程趕在日誌文件中的變化,更新所有訂閱者。如果我的簡單代碼可以工作,我會很高興。 – IsraelKo 2013-02-10 20:42:25