【问题标题】:TextReader and TextWriter over WCFWCF 上的 TextReader 和 TextWriter
【发布时间】:2014-12-03 17:34:01
【问题描述】:

我正在尝试第四次写这个问题,因为很遗憾我不确定我真正想要什么。请原谅我含糊不清或有点离题。

我有一个命令行 .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),然后先从QueueThread.Sleep 返回一段时间并重新检查,但每次我觉得我需要@ 987654331@ 和 Thread.Sleep 我宁愿来这里,因为我觉得我错过了什么......

【问题讨论】:

  • 我建议您忘记 TextReaderTextWriter,而直接使用 WCF。
  • 听起来你想使用WCF的duplex channel shape,这样你就可以进行异步双向通信了。

标签: c# wcf console-application


【解决方案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

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

如果您可以接受保持连接打开,那么您可以实施某种保持活动机制。

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

【讨论】:

  • 我同意保持活动和双工的建议。操作调用应尽快关闭,但使用双工绑定,您可以根据需要保持连接打开(对 .NET 客户端),允许任何一方随时发送请求。
猜你喜欢
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多