我正在尝试第四次写这个问题,因为不幸的是我不确定我真正想要的是什么。请原谅我的含糊其辞或有点离谱。
我有一个命令行.NET4.5 C#应用程序。我将在两个地理位置相距较远的地方同时运行它。我希望能够将一个实例转换为主机,将另一个实例转换为客户端。
在它的核心,我想要一个TextReader实现,它在读取/读取行时等待来自远程客户端的输入。我还想要一个TextWriter,它在写入/写入行时将调用远程客户端并将文本传递给它。
当然,TextWriter是相当简单的事情,因为我基本上就是这样做的:在写入时,对另一个实例调用client.SendText(s);。
在这种情况下,我该如何实现TextReader.ReadLine()?一个简单的方法是,在WCF服务中有一个方法:
class Service : IService{
void SendText(string s){
Console.WriteLine(s); // or whatever is the destination TextWriter
}
string ReadLine(){
return Console.ReadLine(); // or whatever is the source TextReader
}
}但是让WCF操作调用打开几分钟甚至几个小时是个好主意吗?
我能看到的另一种方式是:
class Service : IService{
void RegisterClient(string url){/* url points to an IService endpoint in client*/}
void SendString(string s){...}
}然后在两个实例中托管它,从客户端调用RegisterClient,提供自己的端点url,然后如果主机想要向客户端返回一些数据-只需调用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),然后先从Queue或Thread.Sleep返回一小段时间并重新检查,但每次我觉得我需要while(true)和Thread.Sleep时,我宁愿来这里,因为我觉得我错过了一些东西……
发布于 2014-12-04 02:02:59
默认的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
**公平警告:根据我的经验,您可能仍然需要处理保持连接活动的问题,以防您计划让服务器在长时间不活动后将消息发送回客户端。
如果您可以接受保持连接打开,那么您可以实现某种保持活动的机制。
如果保持连接打开是不可接受的,那么我认为您需要考虑一种更复杂的方法,该方法涉及客户端定期向服务器签入,以便服务器有机会向客户端发送它为客户端提供的任何排队的消息。
https://stackoverflow.com/questions/27278050
复制相似问题