2014-12-03 2 views
0

Я пытаюсь написать этот вопрос в четвертый раз, так как, к сожалению, я не уверен, чего я на самом деле хочу. Пожалуйста, извините, что я расплывчата или немного смущена.TextReader и TextWriter над WCF

У меня есть приложение командной строки .NET4.5 C#. Я буду запускать его одновременно в двух географически отдаленных местах. Я хочу иметь возможность превратить один экземпляр в хост, а другой - в клиент.

В основе этого я хочу реализовать реализацию TextReader, которая после Read/ReadLine ожидает ввода от удаленного клиента. Я также хочу, чтобы TextWriter на Write/WriteLine вызывал удаленный клиент и передавал ему текст.

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

А затем разместить его в обоих случаях, вызовите 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 я d скорее приходят сюда, потому что я думаю, что мне что-то не хватает ....

+1

Я бы предложил вам забыть о 'TextReader' и' TextWriter', а вместо этого просто работать напрямую с WCF. –

+0

Похоже, вы хотите использовать форму дуплексного канала WCF (http://msdn.microsoft.com/en-us/library/ms731064%28v=vs.110%29.aspx), чтобы вы могли иметь асинхронный bi -направленная связь. –

ответ

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

Смежные вопросы