
Базовая композиция приложения wcf
При построении распределенной системы WCF обычно создаются три взаимосвязанных сборки.
Сборка службы WCF.Эта библиотека *.dll содержит классы и интерфейсы, представляющие обитую функциональность, которая предлагается внешним клиентам.
Хост службы WCF.Этот программный модуль — сущность, которая принимает в себе сборку службы WCF.
Клиент WCF.Это приложение, которое обращается к функциональности службы через промежуточный прокси.
Хосты и клиенты взаимодействуют друг с другом, согласовывая так называемые ABC— условное наименование для запоминания основных строительных блоков приложенияWCF, таких как адрес, привязка и контракт (address,binding,contract—ABC).
Адрес. Описывает местоположение службы. В коде представлен типомSystem.Uri, однако значение обычно хранится в файлах *.сonfig.
Привязка.WCFпоставляется с множеством различных привязок, которые указывают сетевые протоколы, механизмы кодирования и транспортный уровень.
Контракт. Предоставляет описание каждого метода, представленного службойWCF.
Понятие контракта является ключевым при построении службы WCF Хотя это и не обязательно, подавляющее большинство приложений WCF будут начинаться с определения типов интерфейсов .NET, используемых для представления набора членов, которые поддерживаются данной службой WCF. В частности, интерфейсы, которые представляют контракт WCF, называются контрактами служб. Классы (или структуры), которые реализуют их, носят название типов служб.
Контракты служб WCF оснащаются различными атрибутами, наиболее часто используемые из которых определены в пространстве имен System.ServiceModel. Когда члены контракта службы (методы в интерфейсе) содержат только простые типы данных (такие как числовые, булевские и строковые), полную службу WCF можно построить, используя одни только атрибуты [ServiceContract] и [OperationContract].
Как только контракт (или набор контрактов) определен и реализован внутри библиотеки службы, следующий логический шаг состоит в построении агента хостинга для самой службы WCF. Как уже упоминалось, на выбор доступно множество возможных вариантов хостов, и все они должны указывать привязки, используемые удаленными клиентами для получения доступа к функциональности типа службы. Выбор из набора привязок — это область, которая отличает разработку WCF от .NET Remoting и/или разработки веб-служб XML. На выбор в WCF доступно множество возможных привязок, каждая из которых ориентирована на определенные потребности. Если ни одна из готовых привязок не удовлетворяет существующим требованиям, можно создать собственную привязку, расширив тип CustomBinding (это в главе делаться не будет). Привязка WCF может описывать следующие характеристики:
транспортный уровень, используемый для передачи данных (HTTP, MSMQ, именованные каналы и TCP);
каналы, используемые транспортом (однонаправленные, запрос-ответ и дуплексные);
механизм кодирования, используемый для работы с данными (XML и двоичный);
любые поддерживаемые протоколы веб-служб (если разрешены привязкой), такие как WS-Security,WS-Transactions,WS-Reliabilityи т.д.
Как только контракты и привязки установлены, финальный элемент мозаики состоит в указании адреса для службы WCF. Это важно, поскольку удаленные клиенты не смогут взаимодействовать с удаленными типами, если им не удастся найти их. Подобно большинству аспектов WCF, адрес может быть жестко закодирован в сборке (с использованием типа System.Uri) или вынесен в файл *.config.
В любом случае точный формат адреса WCF отличается в зависимости от выбранной привязки (на основе HTTP, именованных каналов, TCP или MSMQ). На самом высоком уровне адреса WCF могут указывать перечисленные ниже единицы информации.
Scheme.Транспортный протокол (HTTP и т.п.).
MachineName.Полностью квалифицированное доменное имя машины.
Port.Во многих случаях не обязательный параметр. Например, привязка HTTP по умолчанию использует порт 80.
Path.Путь к службе WCF
Эта информация может быть представлена следующим обобщенным шаблоном (значение Port необязательно, поскольку некоторые привязки его не используют):
Scheme : //<MachineName-> [ : Port] /Path