Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF上的TextReader和TextWriter_C#_Wcf_Console Application - Fatal编程技术网

C# WCF上的TextReader和TextWriter

C# WCF上的TextReader和TextWriter,c#,wcf,console-application,C#,Wcf,Console Application,这是我第四次尝试写这个问题,不幸的是我不确定我到底想要什么。请原谅我说得含糊不清或有点离题 我有一个命令行.NET4.5c#应用程序。我将在两个地理位置遥远的地方同时运行它。我希望能够将一个实例转换为主机,另一个转换为客户端 在它的核心,我想要一个TextReader实现,它在读取/读取时等待来自远程客户端的输入。我还需要一个TextWriter,它在写/写时将调用远程客户端并将文本传递给它 TextWriter当然很简单,因为我基本上就是这么做的:在编写时,调用client.SendText到

这是我第四次尝试写这个问题,不幸的是我不确定我到底想要什么。请原谅我说得含糊不清或有点离题

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

在它的核心,我想要一个TextReader实现,它在读取/读取时等待来自远程客户端的输入。我还需要一个TextWriter,它在写/写时将调用远程客户端并将文本传递给它

TextWriter当然很简单,因为我基本上就是这么做的:在编写时,调用
client.SendText到另一个实例

在这种情况下,如何实现
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...
   }
}

我可以对传入的消息进行
队列
,然后执行
while(true)
,或者先从
队列
线程返回。先睡一会儿,然后重新检查,但每次我觉得需要
while(true)
线程时。睡眠
我宁愿来这里,因为我认为我遗漏了一些东西……

默认的WCF消息模式是请求/响应;客户端发送一个请求,服务器响应它

然而,存在一种双工消息模式,其中服务接口契约将另一个接口标识为其回调接口契约;客户端必须实现此回调接口约定,类似于服务必须实现服务接口约定的方式

此消息模式应允许服务器向客户端任意发送消息,而无需客户端提示

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

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


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

我建议您忘记
TextReader
TextWriter
,而只需直接使用WCF。听起来你想使用WCF,这样你就可以进行异步双向通信。我同意保持活动和双工的建议。应该尽快关闭操作调用,但是使用双工绑定,可以让连接(到.NET客户端)保持打开状态,并允许任何一方随时发送请求。