2014-12-03 36 views
0

我想第四次寫這個問題,因爲我很遺憾不知道我真正想要什麼。請原諒我模糊或稍微偏離。TextReader和TextWriter通過WCF

我有一個命令行.NET4.5 C#應用程序。我會在兩個地理位置相距遙遠的地方同時運行它。我希望能夠將一個實例變成主機,另一個變成客戶端。

在它的核心,我想要一個TextReader實現,在Read/ReadLine等待來自遠程客戶端的輸入。我也想要一個Write/WriteLine的TextWriter將調用遠程客戶端並將文本傳遞給它。

TextWriter當然是相當簡單的事情,因爲我基本上是這樣做的:在編寫時,請給另一個實例調用client.SendText(s);

如何在該場景中執行TextReader.ReadLine()?一個天真的形式給出。將具有在WCF服務的方法:

但保持WCF操作調用打開幾分鐘甚至幾小時一個好主意?

的另一種方式,我可以看到的是有:

class Service : IService{ 
    void RegisterClient(string url){/* url points to an IService endpoint in client*/} 
    void SendString(string s){...} 
} 

然後在這兩種情況下舉辦的,從客戶提供自己的端點URL調用RegisterClient,然後,如果主機要一些數據返回到客戶端 - 只是調用SendString,沒問題。但是,如果主持人必須等待客戶的意見,如何合理解決呢?

class WCFTextReader : TextReader{ 
    public override string ReadLine(){ 
     // what here? it should return whatever comes in the next SendString call from client... 
    } 
} 

我收到的郵件的Queue<string>,然後做一個while(true),要麼從QueueThread.Sleep先回了一小會兒,然後重新檢查,但每次我覺得我需要while(true)Thread.Sleep我d寧願來這裏,因爲我覺得我失去了一些東西......

+1

我建議你忘掉'TextReader'和'TextWriter',而是直接使用WCF。 – 2014-12-03 17:36:27

+0

這聽起來像你想使用WCF的[雙工通道形狀](http://msdn.microsoft.com/en-us/library/ms731064%28v=vs.110%29.aspx),以便您可以有異步bi雙向溝通。 – 2014-12-03 17:52:18

回答

1

默認的WCF消息模式是請求/響應;一個客戶發送一個請求,服務器響應它。

但是,有一個雙工消息模式,其中服務接口協定將另一個接口標識爲其回調接口協定;客戶端必須實現這個回調接口合約,類似於服務必須實現服務接口合約的方式。

此消息模式應允許您的服務器任意發送消息給客戶端,而客戶端不必提示它這樣做。

http://msdn.microsoft.com/en-us/library/ms731064%28v=vs.110%29.aspx

http://msdn.microsoft.com/en-us/library/ms731184%28v=vs.110%29.aspx

**公平的警告:在我的經驗,你可能仍然要處理保活連接的問題,如果你打算讓服務器發送回一個消息在很長一段時間不活動之後向客戶提供。

如果保持連接打開是可以接受的,那麼你可以實現某種保活機制。

如果保持連接打開是不可接受的,那麼我認爲你需要看一個更復雜的方法,這將涉及客戶端定期檢查服務器,以便服務器有機會發送客戶端任何排隊的消息,它爲客戶端。

+0

我同意保持活力和雙面建議。操作調用應儘快關閉,但使用雙工綁定時,您可以保持連接(對於.NET客戶端)持續時間長,只要您願意,可以讓任何一方隨時發送請求。 – user2920518 2014-12-04 00:10:21