TextReader and TextWriter over WCF

本文关键字:WCF over TextWriter and TextReader | 更新日期: 2023-09-27 18:33:09

我正在尝试第四次写这个问题,因为不幸的是,我不确定我真正想要什么。请原谅我含糊不清或有点不对劲。

我有一个命令行.NET4.5 C# 应用程序。我将在两个地理位置相距遥远的位置同时运行它。我希望能够将一个实例转换为主机,将另一个实例转换为客户端。

在它的核心,我想要一个TextReader实现,在Read/ReadLine上等待来自远程客户端的输入。我还想要一个TextWriter,它将在Write/WriteLine上调用远程客户端并将文本传递给它。

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){...}
}

然后在两个实例中托管它,从提供自己的端点 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),要么先从Queue返回,要么Thread.Sleep一小会儿并重新检查,但每次我觉得我需要while(true)Thread.Sleep我宁愿来这里,因为我认为我错过了一些东西......

TextReader and TextWriter over WCF

默认的 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

**公平警告:根据我的经验,如果您计划让服务器在长时间不活动后将消息发送回客户端,您可能仍然需要处理保持连接活动的问题。

如果您可以接受保持连接打开,则可以实现某种保持活动状态机制。

如果保持连接打开是不可接受的,那么我认为您需要研究一种更复杂的方法,该方法将涉及客户端定期与服务器签入,以便服务器有机会向客户端发送任何排队的消息客户端。