Должен ли я использовать WCF для простого текстового проводного протокола? - PullRequest
3 голосов
/ 23 марта 2011

Мне нужно написать программу, которая будет взаимодействовать с другими программами .NET ... но также и унаследованную программу VFP через TCP.Мне нужно выбрать довольно простой формат сообщений TCP, который может использовать программист VFP.Это может быть так же просто, как последовательность небольших блобов XML, разделенных ... Я не знаю, нулевой символ?Как бы то ни было.

Мне нужно выбрать между TcpListener / TcpClient и WCF.Я начал исследовать WCF, но его архитектура кажется непрозрачной, а встроенные шаблоны Visual Studio сильно склоняются к созданию "веб-сервисов", которые действуют как своего рода механизм RPC, но требуют специального "хоста" или веб-сервера, внешнего по отношению к приложению.,А 6-этапное руководство Microsoft делает звук WCF довольно громоздким (с использованием генераторов кода, командной строки и дерьма XML только для удаленного вычитания или умножения двух чисел).

Я хочу автономныйприложение (без «хоста»), я хочу контролировать проводной протокол и я хочу понять, как он работает. WCF, кажется, не облегчает эти вещи, поэтому я отказался от него, учитывая фактор TcpListener /TcpClient.

Тем не менее, программа должна служить посредником между одним (VFP) сервером и многими (.NET) клиентами, и будет связь в обоих направлениях и между разными соединениями.Используя TcpListener и TcpClient, работа по манипулированию соединениями и потоками становится немного грязной, у меня нет опыта работы с IAsyncResult, и я не просто не уверен в качестве своего кода.

Итак, я хотел бы еще раз запросить мнения: должен ли я по-прежнему рассматривать WCF?Если да, можете ли вы указать мне ответы на следующие вопросы?

  1. Где в Интернете хорошее объяснение архитектуры WCF?Или мне нужна книга?
  2. Как осуществляется двунаправленная связь в WCF, где любая сторона (одного соединения TCP) может отправлять сообщение в любое время?
  3. Как я могупройти через все веб-сервисы и RPC mumbo-jumbo и управлять проводным протоколом?
  4. В WCF как мне аккуратно завершить работу приложения, параллельно закрывая все соединения без хакерских команд Thread.Abort ()?

Если нет, как я могу настроить свой код (который использует TcpListener / TcpClient / NetworkStream), чтобы я мог читать сообщения из NetworkStream, но также принимать запросы от других подключений, завершать работучисто в любое время и не тратить время процессора на опрос очередей и NetworkStreams, которые неактивны?

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

Краткий ответ: иди с WCF.Несмотря на то, что вокруг него много инструментов и средств генерации кода и других наворотов, ничто не мешает вам настроить все в коде (вы можете определить свои контракты, настроить конечные точки и т. Д. Все в коде).

По вашим конкретным вопросам:

  1. Архитектура WCF - Это довольно просто, и оно должно помочь вам начать работу относительно быстро.
  2. То, что вы ищете, это дуплексные услуги .NetTcpBinding позволяет использовать дуплексные службы "из коробки" (хотя вы можете сделать это с помощью HTTP, вам нужна специальная привязка).
  3. Если вы хотите управлять форматом передачи, вам нужно создать пользовательский кодер .Тем не менее, я должен настоятельно рекомендовать против этого.Вы хотите создать XML-файл с нулевым символом для разграничения отдельных сообщений?В этом нет необходимости, природа XML такова, что вы можете создавать дочерние элементы для выполнения соответствующей группировки;нет предела тому, сколько элементов вы можете вкладывать.На самом деле в этом нет необходимости.
  4. Просто выключите ServiceHost , вызвав Закрыть , это позволит выполнить все невыполненные запросы и затем корректно завершить работу.Если вы действительно хотите снести без беспокойства, то позвоните Прервать .

В конце я бы настоятельно рекомендовал вам не использовать NetTcpBinding;VFP будет трудно использовать протокол.Однако если вы используете протокол на основе HTTP, всегда есть инструменты, которые VFP может легко использовать для выполнения вызова и потребления содержимого (при условии, что вы придерживаетесь XML).

1 голос
/ 25 марта 2011

Просто для того, чтобы рассказать об общих принципах использования DCOM, VFP может использовать DCOM, но это необходимо сделать с помощью CreateObjectEx () ... единственная большая разница в том, что вам нужно знать GUID экземпляра класса, к которому вы подключаетесь на любом сервере, к которому он подключается, И имя машины, к которой он будет подключаться.

Затем удаленный объект выполняет свою работу через открытые функции, но VFP, вызывающий его с другого компьютера в сети, обрабатывает его так, как если бы функция выполнялась локально, и получает все возвращаемые значения.

Я сделал DCOM с VFP еще 10 лет назад для страховой компании ...

...