WCF — Обзор
WCF обозначает Windows Communication Foundation. Элементарной особенностью WCF является функциональная совместимость. Это одна из новейших технологий Microsoft, которая используется для создания сервис-ориентированных приложений. Основываясь на концепции обмена сообщениями на основе сообщений, в которой HTTP-запрос представлен единообразно, WCF позволяет использовать унифицированный API независимо от различных транспортных механизмов.
WCF был впервые выпущен в 2006 году как часть .NET Framework с Windows Vista, а затем несколько раз обновлялся. WCF 4.5 — самая последняя версия, которая сейчас широко используется.
Приложение WCF состоит из трех компонентов:
- Сервис WCF,
- Узел службы WCF и
- Клиент службы WCF.
Платформа WCF также называется моделью обслуживания.
Основные концепции WCF
Сообщение
Это коммуникационный блок, состоящий из нескольких частей, не связанных с корпусом. Экземпляры сообщений отправляются, а также принимаются для всех типов связи между клиентом и службой.
Конечная точка
Он определяет адрес, по которому сообщение должно быть отправлено или получено. Он также определяет механизм связи для описания того, как сообщения будут отправляться вместе с определением набора сообщений. Структура конечной точки состоит из следующих частей:
Адрес
Адрес указывает точное местоположение для получения сообщений и указывается в качестве универсального идентификатора ресурса (URI). Это выражается в виде схемы: // домен [: порт] / [путь]. Посмотрите на адрес, указанный ниже —
net.tcp: // локальный: 9000 / ServiceA
Здесь net.tcp — это схема протокола TCP. Домен «localhost» может быть именем компьютера или веб-домена, а путь — «ServiceA».
переплет
Он определяет способ связи конечной точки. Он состоит из некоторых обязательных элементов, которые составляют инфраструктуру для связи. Например, в привязке указываются протоколы, используемые для транспорта, такие как TCP, HTTP и т. Д., Формат кодирования сообщений и протоколы, связанные с безопасностью, а также надежностью.
контракты
Это набор операций, который определяет, какую функциональность конечная точка предоставляет клиенту. Обычно состоит из имени интерфейса.
Хостинг
Хостинг с точки зрения WCF относится к хостингу сервисов WCF, который может быть реализован с помощью множества доступных опций, таких как собственный хостинг, хостинг IIS и хостинг WAS.
Метаданные
Это важная концепция WCF, поскольку она облегчает взаимодействие между клиентским приложением и службой WCF. Обычно метаданные для службы WCF генерируются автоматически при включении, и это делается путем проверки службы и ее конечных точек.
Клиент WCF
Клиентское приложение, которое создается для предоставления сервисных операций в форме методов, называется клиентом WCF. Это может быть размещено любым приложением, даже тем, которое делает обслуживание хостингом.
канал
Канал — это среда, посредством которой клиент общается со службой. Различные типы каналов суммируются и называются стеками каналов.
МЫЛО
Несмотря на то, что он называется «Протокол доступа к простым объектам», SOAP не является транспортным протоколом; вместо этого это XML-документ, состоящий из заголовка и основной части.
Преимущества WCF
-
Он совместим с другими службами. Это резко контрастирует с .NET Remoting, в котором и клиент, и служба должны иметь .Net.
-
Службы WCF обеспечивают повышенную надежность и безопасность по сравнению с веб-службами ASMX (Active Server Methods).
-
Реализация модели безопасности и изменение привязки в WCF не требуют серьезных изменений в кодировании. Для соответствия ограничениям требуется всего несколько изменений конфигурации.
-
WCF имеет встроенный механизм ведения журналов, тогда как в других технологиях необходимо выполнять необходимое кодирование.
-
WCF интегрировал AJAX и поддерживает JSON (нотация объектов JavaScript).
-
Он предлагает масштабируемость и поддержку новых стандартов веб-сервисов.
-
У этого есть механизм безопасности по умолчанию, который является чрезвычайно надежным.
Он совместим с другими службами. Это резко контрастирует с .NET Remoting, в котором и клиент, и служба должны иметь .Net.
Службы WCF обеспечивают повышенную надежность и безопасность по сравнению с веб-службами ASMX (Active Server Methods).
Реализация модели безопасности и изменение привязки в WCF не требуют серьезных изменений в кодировании. Для соответствия ограничениям требуется всего несколько изменений конфигурации.
WCF имеет встроенный механизм ведения журналов, тогда как в других технологиях необходимо выполнять необходимое кодирование.
WCF интегрировал AJAX и поддерживает JSON (нотация объектов JavaScript).
Он предлагает масштабируемость и поддержку новых стандартов веб-сервисов.
У этого есть механизм безопасности по умолчанию, который является чрезвычайно надежным.
WCF — Versus Web Service
Между WCF и веб-службой существуют некоторые существенные различия, которые перечислены ниже.
-
Атрибуты — служба WCF определяется атрибутами ServiceContract и OperationContract, тогда как веб-служба определяется атрибутами WebService и WebMethod.
-
Протоколы — WCF поддерживает ряд протоколов, т. Е. HTTP, именованные каналы, TCP и MSMQ, тогда как веб-служба поддерживает только протокол HTTP.
-
Механизмы хостинга. Существуют различные механизмы активации для хостинга WCF, например, IIS (информационная служба Интернета), WAS (служба активации Windows), собственный хостинг и служба Windows, но веб-служба размещается только в IIS.
-
Службы — WCF поддерживает надежную безопасность, надежный обмен сообщениями, транзакции и взаимодействие, а веб-служба поддерживает только службы безопасности.
-
Сериализатор — WCF поддерживает сериализатор DataContract, используя System.Runtime.Serialization, тогда как веб-сервис поддерживает XML-сериализатор, используя System.Xml.Serialization.
-
Инструменты — инструмент ServiceMetadata (svcutil.exe) используется для генерации клиента для службы WCF, а инструмент WSDL.EXE — для его генерации для веб-службы.
-
Обработка исключений — В WCF необработанные исключения обрабатываются лучше, используя FaultContract. Они не возвращаются клиенту, как в веб-сервисе, как ошибки SOAP.
-
Хеш-таблица — можно сериализовать хеш-таблицу в WCF, но это не так в веб-сервисе.
-
Привязки — WCF поддерживает несколько типов привязок, таких как BasicHttpBinding, WSDualHttpBinding, WSHttpBinding и т. Д., А веб-служба поддерживает только SOAP или XML.
-
Многопоточность — WCF поддерживает многопоточность с использованием класса ServiceBehavior, тогда как это не поддерживается в веб-службе.
-
Операции дуплексной службы — WCF поддерживает операции дуплексной службы, кроме поддержки односторонних операций и операций запроса-ответа, тогда как веб-служба не поддерживает операции дуплексной службы.
Атрибуты — служба WCF определяется атрибутами ServiceContract и OperationContract, тогда как веб-служба определяется атрибутами WebService и WebMethod.
Протоколы — WCF поддерживает ряд протоколов, т. Е. HTTP, именованные каналы, TCP и MSMQ, тогда как веб-служба поддерживает только протокол HTTP.
Механизмы хостинга. Существуют различные механизмы активации для хостинга WCF, например, IIS (информационная служба Интернета), WAS (служба активации Windows), собственный хостинг и служба Windows, но веб-служба размещается только в IIS.
Службы — WCF поддерживает надежную безопасность, надежный обмен сообщениями, транзакции и взаимодействие, а веб-служба поддерживает только службы безопасности.
Сериализатор — WCF поддерживает сериализатор DataContract, используя System.Runtime.Serialization, тогда как веб-сервис поддерживает XML-сериализатор, используя System.Xml.Serialization.
Инструменты — инструмент ServiceMetadata (svcutil.exe) используется для генерации клиента для службы WCF, а инструмент WSDL.EXE — для его генерации для веб-службы.
Обработка исключений — В WCF необработанные исключения обрабатываются лучше, используя FaultContract. Они не возвращаются клиенту, как в веб-сервисе, как ошибки SOAP.
Хеш-таблица — можно сериализовать хеш-таблицу в WCF, но это не так в веб-сервисе.
Привязки — WCF поддерживает несколько типов привязок, таких как BasicHttpBinding, WSDualHttpBinding, WSHttpBinding и т. Д., А веб-служба поддерживает только SOAP или XML.
Многопоточность — WCF поддерживает многопоточность с использованием класса ServiceBehavior, тогда как это не поддерживается в веб-службе.
Операции дуплексной службы — WCF поддерживает операции дуплексной службы, кроме поддержки односторонних операций и операций запроса-ответа, тогда как веб-служба не поддерживает операции дуплексной службы.
WCF — Инструменты разработчика
Для разработки приложения-службы WCF в основном есть два инструмента — Microsoft Visual Studio и CodePlex. Microsoft Visual Studio представляет собой полный пакет средств разработки, необходимых для разработки большого количества разнообразных приложений, таких как веб-приложения ASP.NET, настольные приложения, мобильные приложения и многие другие.
Microsoft Visual Studio использует функциональные возможности платформы .NET. CodePlex, с другой стороны, представляет собой сайт Microsoft с открытым исходным кодом, предлагающий несколько бесплатных инструментов для разработки приложений-служб WCF.
Microsoft Visual Studio
Существует множество выпусков Microsoft Visual Studio, и изначально (Visual Studio 2005) не был горячим сторонником разработки WCF. В настоящее время Visual Studio 2008 является единственной Microsoft IDE, доступной для разработки приложений-служб WCF.
В настоящее время последняя версия Microsoft Visual Studio 2010 также является предпочтительным инструментом для разработки приложения-службы WCF. В Visual Studio также есть готовый шаблон для разработки приложения-службы WCF.
Выбор такого шаблона приводит к добавлению файлов для следующих целей —
- Контракт на обслуживание
- Внедрение сервиса
- Сервисная конфигурация
Обязательные атрибуты добавляются автоматически, а Microsoft Visual Studio создает простой сервис «Hello World», даже не создавая никакого кода.
CodePlex
CodePlex был запущен Microsoft в июне 2006 года, и с тех пор он используется большим количеством разработчиков по всему миру для успешного создания проектов .NET. Вот некоторые из инструментов, предлагаемых CodePlex для разработки приложений-служб WCF:
-
wscf.blue — это надстройка для Microsoft Visual Studio, а также набор инструментов разработки «сначала по контракту», который облегчает определение операций службы WCF и, соответственно, создание каркаса кода. Важная ссылка для того же — https://wscfblue.codeplex.com
-
WCFProxyGenerator — это также надстройка Microsoft Visual Studio. Инструмент используется для расширения генерации на стороне клиента и предлагает дополнительную обработку ошибок. Для получения дополнительной информации об этом конкретном инструменте разработки, посетите https://wcfproxygenerator.codeplex.com
-
WCFMock — Тестирование службы WCF может быть сложной задачей, и этот инструмент разработки предлагает удобное решение для модульного тестирования служб WCF с помощью его полезных классов. Для получения дополнительной информации об этом инструменте, посетите https://wcfmock.codeplex.com
wscf.blue — это надстройка для Microsoft Visual Studio, а также набор инструментов разработки «сначала по контракту», который облегчает определение операций службы WCF и, соответственно, создание каркаса кода. Важная ссылка для того же — https://wscfblue.codeplex.com
WCFProxyGenerator — это также надстройка Microsoft Visual Studio. Инструмент используется для расширения генерации на стороне клиента и предлагает дополнительную обработку ошибок. Для получения дополнительной информации об этом конкретном инструменте разработки, посетите https://wcfproxygenerator.codeplex.com
WCFMock — Тестирование службы WCF может быть сложной задачей, и этот инструмент разработки предлагает удобное решение для модульного тестирования служб WCF с помощью его полезных классов. Для получения дополнительной информации об этом инструменте, посетите https://wcfmock.codeplex.com
Еще один бесплатный инструмент для простой и удобной разработки приложений-служб WCF — WCFStorm. Его версия LITE предлагает множество ярких функций для динамического вызова и тестирования служб WCF, редактирования привязки служб, изменения конечной точки URL-адреса WCF и т. Д.
WCF — Архитектура
WCF имеет многоуровневую архитектуру, которая предлагает широкие возможности для разработки различных распределенных приложений. Архитектура объясняется ниже подробно.
контракты
Уровень контрактов находится рядом с прикладным уровнем и содержит информацию, аналогичную уровню реального контракта, который определяет работу службы и вид доступной информации, которую он будет создавать. Контракты в основном бывают четырех типов, которые кратко обсуждаются ниже.
-
Контракт на обслуживание — этот контракт предоставляет клиенту, а также внешнему миру информацию о предложениях конечной точки и протоколах, которые будут использоваться в процессе связи.
-
Контракт данных — данные, которыми обменивается сервис, определяются контрактом данных. И клиент, и сервис должны быть согласованы с договором на данные.
-
Контракт сообщения — контракт данных контролируется контрактом сообщения. Он в первую очередь выполняет настройку форматирования типов параметров сообщений SOAP. Здесь следует отметить, что WCF использует формат SOAP для связи. SOAP означает простой протокол доступа к объектам.
-
Политика и связывание. Существуют определенные предварительные условия для связи со службой, и такие условия определяются политикой и обязательным договором. Клиент должен следовать этому контракту.
Контракт на обслуживание — этот контракт предоставляет клиенту, а также внешнему миру информацию о предложениях конечной точки и протоколах, которые будут использоваться в процессе связи.
Контракт данных — данные, которыми обменивается сервис, определяются контрактом данных. И клиент, и сервис должны быть согласованы с договором на данные.
Контракт сообщения — контракт данных контролируется контрактом сообщения. Он в первую очередь выполняет настройку форматирования типов параметров сообщений SOAP. Здесь следует отметить, что WCF использует формат SOAP для связи. SOAP означает простой протокол доступа к объектам.
Политика и связывание. Существуют определенные предварительные условия для связи со службой, и такие условия определяются политикой и обязательным договором. Клиент должен следовать этому контракту.
Сервис Runtime
Уровень выполнения службы находится чуть ниже уровня контрактов. Он определяет различные режимы работы службы, возникающие во время выполнения. Существует много типов поведения, которые могут подвергаться настройке и входить в среду выполнения службы.
-
Throttling Behavior — управляет количеством обработанных сообщений.
-
Поведение ошибки — Определяет результат возникновения любой внутренней ошибки службы.
-
Metadata Behavior — определяет доступность метаданных для внешнего мира.
-
Поведение экземпляра — определяет количество экземпляров, которые необходимо создать, чтобы сделать их доступными для клиента.
-
Поведение транзакции — позволяет изменить состояние транзакции в случае любого сбоя.
-
Dispatch Behavior — контролирует способ обработки сообщения инфраструктурой WCF.
-
Параллельное поведение — управляет функциями, которые выполняются параллельно во время обмена данными между клиентом и сервером.
-
Фильтрация параметров — показывает процесс проверки параметров метода до его вызова.
Throttling Behavior — управляет количеством обработанных сообщений.
Поведение ошибки — Определяет результат возникновения любой внутренней ошибки службы.
Metadata Behavior — определяет доступность метаданных для внешнего мира.
Поведение экземпляра — определяет количество экземпляров, которые необходимо создать, чтобы сделать их доступными для клиента.
Поведение транзакции — позволяет изменить состояние транзакции в случае любого сбоя.
Dispatch Behavior — контролирует способ обработки сообщения инфраструктурой WCF.
Параллельное поведение — управляет функциями, которые выполняются параллельно во время обмена данными между клиентом и сервером.
Фильтрация параметров — показывает процесс проверки параметров метода до его вызова.
обмен сообщениями
Этот уровень, состоящий из нескольких каналов, в основном имеет дело с содержимым сообщения, которое должно быть передано между двумя конечными точками. Набор каналов формирует стек каналов, и два основных типа каналов, которые составляют стек каналов, являются следующими:
-
Транспортные каналы. Эти каналы находятся в нижней части стека и отвечают за отправку и получение сообщений с использованием транспортных протоколов, таких как HTTP, TCP, Peer-to-Peer, Named Pipes и MSMQ.
-
Каналы протоколов. Эти каналы, также называемые многоуровневыми каналами, присутствуют в верхней части стека и реализуют протоколы проводного уровня путем изменения сообщений.
Транспортные каналы. Эти каналы находятся в нижней части стека и отвечают за отправку и получение сообщений с использованием транспортных протоколов, таких как HTTP, TCP, Peer-to-Peer, Named Pipes и MSMQ.
Каналы протоколов. Эти каналы, также называемые многоуровневыми каналами, присутствуют в верхней части стека и реализуют протоколы проводного уровня путем изменения сообщений.
Активация и хостинг
Последний уровень архитектуры WCF — это место, где службы фактически размещены или могут быть выполнены для легкого доступа клиентом. Это делается с помощью различных механизмов, которые кратко обсуждаются ниже.
-
IIS — IIS расшифровывается как Internet Information Service. Он предлагает множество преимуществ использования протокола HTTP сервисом. Здесь не требуется иметь код хоста для активации сервисного кода; вместо этого сервисный код активируется автоматически.
-
Служба активации Windows — широко известная как WAS и поставляется с IIS 7.0. Здесь возможна связь как на основе HTTP, так и без HTTP, с использованием протоколов TCP или Namedpipe.
-
Самостоятельный хостинг — это механизм, с помощью которого служба WCF автоматически размещается как консольное приложение. Этот механизм предлагает удивительную гибкость с точки зрения выбора желаемых протоколов и настройки собственной схемы адресации.
-
Служба Windows — размещение службы WCF с этим механизмом является преимуществом, поскольку службы остаются активированными и доступными для клиента из-за отсутствия активации во время выполнения.
IIS — IIS расшифровывается как Internet Information Service. Он предлагает множество преимуществ использования протокола HTTP сервисом. Здесь не требуется иметь код хоста для активации сервисного кода; вместо этого сервисный код активируется автоматически.
Служба активации Windows — широко известная как WAS и поставляется с IIS 7.0. Здесь возможна связь как на основе HTTP, так и без HTTP, с использованием протоколов TCP или Namedpipe.
Самостоятельный хостинг — это механизм, с помощью которого служба WCF автоматически размещается как консольное приложение. Этот механизм предлагает удивительную гибкость с точки зрения выбора желаемых протоколов и настройки собственной схемы адресации.
Служба Windows — размещение службы WCF с этим механизмом является преимуществом, поскольку службы остаются активированными и доступными для клиента из-за отсутствия активации во время выполнения.
WCF — Создание службы WCF
Создание службы WCF — простая задача с использованием Microsoft Visual Studio 2012. Ниже приведен пошаговый метод создания службы WCF вместе со всем необходимым кодированием, чтобы лучше понять концепцию.
- Запустите Visual Studio 2012.
- Нажмите на новый проект, затем на вкладке Visual C # выберите опцию WCF.
Создается служба WCF, которая выполняет основные арифметические операции, такие как сложение, вычитание, умножение и деление. Основной код находится в двух разных файлах — один интерфейс и один класс.
WCF содержит один или несколько интерфейсов и его реализованные классы.
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfServiceLibrary1 { // NOTE: You can use the "Rename" command on the "Refactor" menu to // change the interface name "IService1" in both code and config file // together. [ServiceContract] Public interface IService1 { [OperationContract] int sum(int num1, int num2); [OperationContract] int Subtract(int num1, int num2); [OperationContract] int Multiply(int num1, int num2); [OperationContract] int Divide(int num1, int num2); } // Use a data contract as illustrated in the sample below to add // composite types to service operations. [DataContract] Public class CompositeType { Bool boolValue = true; String stringValue = "Hello "; [DataMember] Public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] Public string StringValue { get { return stringValue; } set { stringValue = value; } } } }
Код его класса приведен ниже.
using System; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Runtime.Serialization; usingSystem.ServiceModel; usingSystem.Text; namespace WcfServiceLibrary1 { // NOTE: You can use the "Rename" command on the "Refactor" menu to // change the class name "Service1" in both code and config file // together. publicclassService1 :IService1 { // This Function Returns summation of two integer numbers publicint sum(int num1, int num2) { return num1 + num2; } // This function returns subtraction of two numbers. // If num1 is smaller than number two then this function returns 0 publicint Subtract(int num1, int num2) { if (num1 > num2) { return num1 - num2; } else { return 0; } } // This function returns multiplication of two integer numbers. publicint Multiply(int num1, int num2) { return num1 * num2; } // This function returns integer value of two integer number. // If num2 is 0 then this function returns 1. publicint Divide(int num1, int num2) { if (num2 != 0) { return (num1 / num2); } else { return 1; } } } }
Чтобы запустить этот сервис, нажмите кнопку «Пуск» в Visual Studio.
Пока мы запускаем этот сервис, появляется следующий экран.
При нажатии на метод сумм открывается следующая страница. Здесь вы можете ввести любые два целых числа и нажать на кнопку Invoke. Сервис вернет суммирование этих двух чисел.
Подобно суммированию, мы можем выполнять все остальные арифметические операции, которые перечислены в меню. А вот и снимки для них.
Следующая страница появляется при нажатии на метод вычитания. Введите целые числа, нажмите кнопку Invoke и получите вывод, как показано здесь —
Следующая страница появляется при нажатии на метод Multiply. Введите целые числа, нажмите кнопку Invoke и получите вывод, как показано здесь —
Следующая страница появляется при нажатии метода Разделить. Введите целые числа, нажмите кнопку Invoke и получите вывод, как показано здесь —
После вызова службы вы можете переключаться между ними прямо отсюда.
WCF — Хостинг WCF Сервис
После создания службы WCF следующий шаг — разместить ее, чтобы ее могли использовать клиентские приложения. Это известно как сервис хостинга WCF. Служба WCF может быть размещена любым из четырех способов, указанных ниже:
-
IIS Hosting — IIS означает Интернет-службы информации. Его рабочая модель аналогична ASP.NET при размещении службы WCF. Лучшая особенность хостинга IIS заключается в том, что активация службы обрабатывается автоматически. Хостинг IIS также предлагает мониторинг работоспособности процесса, отключение на холостом ходу, повторное использование процессов и многие другие функции, облегчающие хостинг службы WCF.
-
Самостоятельный хостинг. Когда служба WCF размещается в управляемом приложении, она называется сам хостингом. Требуется, чтобы разработчик написал необходимую кодировку для инициализации ServiceHost. При самостоятельном размещении служба WCF может размещаться в различных приложениях, таких как консольное приложение, форма Windows и т. Д.
-
Хостинг WAS — размещение службы WCF в Windows Activation Service (WAS) является наиболее выгодным из-за его функций, таких как переработка процессов, управление временем простоя, общая система конфигурации и поддержка HTTP, TCP и т. Д.
-
Хостинг служб Windows. Для локальных системных клиентов лучше всего размещать службу WCF в качестве службы окон, и это называется хостингом служб Windows. Все версии Windows поддерживают этот тип хостинга, и здесь Диспетчер управления службами может управлять жизненным циклом процесса службы WCF.
IIS Hosting — IIS означает Интернет-службы информации. Его рабочая модель аналогична ASP.NET при размещении службы WCF. Лучшая особенность хостинга IIS заключается в том, что активация службы обрабатывается автоматически. Хостинг IIS также предлагает мониторинг работоспособности процесса, отключение на холостом ходу, повторное использование процессов и многие другие функции, облегчающие хостинг службы WCF.
Самостоятельный хостинг. Когда служба WCF размещается в управляемом приложении, она называется сам хостингом. Требуется, чтобы разработчик написал необходимую кодировку для инициализации ServiceHost. При самостоятельном размещении служба WCF может размещаться в различных приложениях, таких как консольное приложение, форма Windows и т. Д.
Хостинг WAS — размещение службы WCF в Windows Activation Service (WAS) является наиболее выгодным из-за его функций, таких как переработка процессов, управление временем простоя, общая система конфигурации и поддержка HTTP, TCP и т. Д.
Хостинг служб Windows. Для локальных системных клиентов лучше всего размещать службу WCF в качестве службы окон, и это называется хостингом служб Windows. Все версии Windows поддерживают этот тип хостинга, и здесь Диспетчер управления службами может управлять жизненным циклом процесса службы WCF.
WCF — IIS хостинг
Размещение службы WCF в IIS (информационные службы Интернета) представляет собой пошаговый процесс. Хостинг IIS подробно проиллюстрирован ниже с желаемым кодированием и скриншотами, чтобы понять процесс.
Шаг 1. Запустите Visual Studio 2012 и выберите Файл → Создать → Веб-сайт. Выберите «Служба WCF» и «Местоположение» как http. Это позволит разместить службу в IIS. Нажмите ОК.
Шаг 2 — Код интерфейса приведен ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; // NOTE: You can use the "Rename" command on the "Refactor" menu to // change the interface name "IService" in both code and config file // together. [ServiceContract] Public interface IService { [OperationContract] String GetData(int value); [OperationContract] CompositeType GetDataUsingDataContract(CompositeType composite); // TODO: Add your service operations here } // Use a data contract as illustrated in the sample below to add // composite types to service operations. [DataContract] Public class CompositeType { Bool boolValue = true; String stringValue = "Hello "; [DataMember] Public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] Public string StringValue { get { return stringValue; } set { stringValue = value; } } }
Шаг 3 — Код файла класса приведен ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; // NOTE: You can use the "Rename" command on the "Refactor" menu to // change the class name "Service" in code, svc and config file // together. Public class Service : IService { Public string GetData(int value) { Return string.Format("You entered: {0}", value); } Public CompositeType GetDataUsingDataContract(CompositeType composite) { if(composite == null) { thrownewArgumentNullException("composite"); } if(composite.BoolValue) { composite.StringValue += "Suffix"; } return composite; } }
Шаг 4 — Сервисный файл (.svc) содержит название сервиса и код за именем файла. Этот файл используется, чтобы узнать об услуге.
<%@ ServiceHost Language = "C#" Debug = "true" Service = "Service" CodeBehind = "~/App_Code/Service.cs" %>
Шаг 5 — Конфигурации на стороне сервера упомянуты в файле конфигурации. Здесь есть упоминание только об одной конечной точке, настроенной на «wsHttpBinding»; у нас также может быть несколько конечных точек с разными привязками. Так как мы собираемся разместить в IIS, мы должны использовать только http-привязку.
<?xml version = "1.0"?> <configuration> <!-- Note: As an alternative to hand editing this file you can use the web admin tool to configure settings for your application. Use the Website->Asp.Net Configuration option in Visual Studio. A full list of settings and comments can be found in machine.config.comments usually located in \Windows\Microsoft.Net\Framework\vx.x\Config --> <configSections> <sectionGroup name = "system.web.extensions" ype = "System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"> <sectionGroup name = "scripting" type = "System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"> <section name = "scriptResourceHandler" type = "System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "MachineToApplication"/> <sectionGroup name = "webServices" type = "System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"> <section name = "jsonSerialization" type = "System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "Everywhere"/> <section name = "profileService" type = "System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "MachineToApplication"/> <section name = "authenticationService" type = "System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "MachineToApplication"/> <section name = "roleService" type = "System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "MachineToApplication"/> </sectionGroup> </sectionGroup> </sectionGroup> </configSections> <appSettings/> <connectionStrings/> <system.web> <!-- Set compilation debug="true" to insert debugging symbols into the compiled page. Because this affects performance, set this value to true only during development. --> <compilation debug = "true"> <assemblies> <add assembly = "System.Core, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = B77A5C561934E089"/> <add assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add assembly = "System.Data.DataSetExtensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = B77A5C561934E089"/> <add assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add assembly = "System.Xml.Linq, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = B77A5C561934E089"/> </assemblies> </compilation> <!-- The <authentication> section enables configuration of the security authentication mode used by ASP.NET to identify an incoming user. --> <authentication mode="Windows"/> <!-- The <customErrors> section enables configuration of what to do if/when an unhandled error occurs during the execution of a request. Specifically, it enables developers to configure html error pages to be displayed in place of a error stack trace. <customErrors mode = "RemoteOnly" defaultRedirect = "GenericErrorPage.htm"> <error statusCode = "403" redirect = "NoAccess.htm" /> <error statusCode = "404" redirect = "FileNotFound.htm" /> </customErrors> --> <pages> <controls> <add tagPrefix = "asp" namespace = "System.Web.UI" assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add tagPrefix = "asp" namespace = "System.Web.UI.WebControls" assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> </controls> </pages> <httpHandlers> <remove verb = "*" path = "*.asmx"/> <add verb = "*" path = "*.asmx" validate = "false" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add verb = "*" path = "*_AppService.axd" validate = "false" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add verb = "GET,HEAD" path = "ScriptResource.axd" type = "System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" validate = "false"/> </httpHandlers> <httpModules> <add name = "ScriptModule" type = "System.Web.Handlers.ScriptModule, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> </httpModules> </system.web> <system.codedom> <compilers> <compiler language = "c#;cs;csharp" extension = ".cs" warningLevel = "4" type = "Microsoft.CSharp.CSharpCodeProvider, System, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089"> <providerOption name = "CompilerVersion" value = "v3.5"/> <providerOption name = "WarnAsError" value = "false"/> </compiler> <compiler language = "vb;vbs;visualbasic;vbscript" extension = ".vb" warningLevel = "4" type = "Microsoft.VisualBasic.VBCodeProvider, System, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089"> <providerOption name = "CompilerVersion" value = "v3.5"/> <providerOption name = "OptionInfer" value = "true"/> <providerOption name = "WarnAsError" value = "false"/> </compiler> </compilers> </system.codedom> <!-- The system.webServer section is required for running ASP.NET AJAX under Internet Information Services 7.0. It is not necessary for previous version of IIS. --> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules> <remove name = "ScriptModule"/> <add name = "ScriptModule" preCondition = "managedHandler" type = "System.Web.Handlers.ScriptModule, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> </modules> <handlers> <remove name = "WebServiceHandlerFactory-Integrated"/> <remove name = "ScriptHandlerFactory"/> <remove name = "ScriptHandlerFactoryAppServices"/> <remove name = "ScriptResource"/> <add name = "ScriptHandlerFactory" verb = "*" path = "*.asmx" preCondition = "integratedMode" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add name = "ScriptHandlerFactoryAppServices" verb = "*" path = "*_AppService.axd" preCondition = "integratedMode" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add name = "ScriptResource" preCondition = "integratedMode" verb = "GET,HEAD" path = "ScriptResource.axd" type = "System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> </handlers> <!--To browse web app root directory during debugging, set the value below to true. Set to false before deployment to avoid disclosing web app folder information.--> <directoryBrowse enabled = "true"/> </system.webServer> <runtime> <assemblyBinding appliesTo = "v2.0.05727" xmlns =" urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name = "System.Web.Extensions" publicKeyToken = "31bf3856ad364e35"/> <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name = "System.Web.Extensions.Design" publicKeyToken =" 31bf3856ad364e35"/> <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> <system.serviceModel> <services> <service name = "Service" behaviorConfiguration = "ServiceBehavior"> <!-- Service Endpoints --> <endpoint address = "" binding = "basicHttpBinding" contract = "IService"> <!-- Upon deployment, the following identity element should be removed or replaced to reflect the identity under which the deployed service runs. If removed, WCF will infer an appropriate identity automatically. --> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address = "mex" binding = "mexHttpBinding" contract = "IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name = "ServiceBehavior"> <!-- To avoid disclosing metadata information, set the value below to false before deployment --> <serviceMetadata httpGetEnabled = "true"/> <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to false avoid disclosing exception information --> <serviceDebug includeExceptionDetailInFaults = "false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Шаг 6 — Вам необходимо указать имя файла службы вместе с адресом, указанным в файле конфигурации. Скриншот IIS приведен здесь.
Нажмите Пуск → Выполнить → inetmgr, чтобы открыть следующее окно.
Шаг 7 — Запустите приложение, которое выведет следующий экран.
WCF — Самостоятельный хостинг
Здесь служба WCF размещается в консольном приложении. Ниже приведен процесс с последовательными подходящими шагами, который объясняет весь процесс.
Шаг 1 — Сначала создадим договор на обслуживание и его реализацию. Создайте консольное приложение и назовите его MyCalculatorService. Это простой сервис для возврата сложения двух чисел.
Шаг 2. Теперь щелкните правой кнопкой мыши ссылки в обозревателе решений и выберите Добавить ссылки. Откроется следующее окно; добавить ссылку System.ServiceModel на проект.
Шаг 3 — Создайте интерфейс ISimpleCalculator, добавьте атрибуты ServiceContract и OperationContract к классу и функции, как показано ниже. Вы узнаете больше об этих контрактах на следующей сессии. Эти контракты будут раскрывать этот метод для использования внешним сервисом.
Шаг 4 — Код этого файла выглядит следующим образом —
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace MyCalculatorWCFService { [ServiceContract()] Public interface ISimpleCalculator { [OperationContract()] int Add(int num1, int num2); } }
Шаг 5 — MyCalculatorService — это класс реализации интерфейса IMyCalculatorService, как показано ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyCalculatorWCFService { Class SimpleCalculator : ISimpleCalculator { Public int Add(int num1, int num2) { return num1 + num2; } } }
Шаг 6 — Теперь мы готовы с сервисом. Давайте перейдем к реализации процесса хостинга. Создайте новое консольное приложение и назовите его «MyCalculatorWCFServiceHost».
Шаг 7 — Добавьте ссылку на system.servicemodel и проект MyCalculatorWCFService.
Код этого выглядит следующим образом —
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MyCalculatorWCFService; using System.ServiceModel; using System.ServiceModel.Description; namespace MyCalculatorWCFServiceHost { class Program { static void Main(string[] args) { //Create a URI to serve as the base address UrihttpUrl = newUri("http://localhost:8090/MyCalculatorWCFService/SimpleCalculator"); //Create ServiceHost ServiceHost host = newServiceHost(typeof(MyCalculatorWCFService.ISimpleCalculator), httpUrl); //Add a service endpoint host.AddServiceEndpoint(typeof(MyCalculatorWCFService.ISimpleCal culator), newWSHttpBinding(), ""); //Enable metadata exchange ServiceMetadataBehaviorsmb = newServiceMetadataBehavior(); smb.HttpGetEnabled = true; host.Description.Behaviors.Add(smb); //Start the Service host.Open(); Console.WriteLine("Service is host at " + DateTime.Now.ToString()); Console.WriteLine("Host is running... Press key to stop"); Console.ReadLine(); } } }
WCF — БЫЛ Хостинг
Чтобы понять концепцию WAS-хостинга, нам необходимо понять, как конфигурируется система и как создается сервисный контракт, позволяющий по-разному связываться с размещенным сервисом.
Прежде всего, включите WCF для не протоколов. Прежде чем мы начнем создавать сервис, нам нужно настроить систему для поддержки WAS. Ниже приведены шаги по настройке WAS:
-
Нажмите «Пуск» → «Панель управления» → «Программы и компоненты» и нажмите «Включить или выключить компоненты Windows» на левой панели.
-
Разверните «Microsoft .Net Framework 3.0» и включите «Активация Windows Communication Foundation HTTP» и «Активация Windows Communication Foundation без HTTP».
-
Далее нам нужно добавить Binding на веб-сайт по умолчанию. В качестве примера, мы свяжем веб-сайт по умолчанию с протоколом TCP. Зайдите в Пуск Меню → Программы → Стандартные. Щелкните правой кнопкой мыши «Командная строка» и выберите «Запуск от имени администратора» из контекстного меню.
-
Выполните следующую команду —
Нажмите «Пуск» → «Панель управления» → «Программы и компоненты» и нажмите «Включить или выключить компоненты Windows» на левой панели.
Разверните «Microsoft .Net Framework 3.0» и включите «Активация Windows Communication Foundation HTTP» и «Активация Windows Communication Foundation без HTTP».
Далее нам нужно добавить Binding на веб-сайт по умолчанию. В качестве примера, мы свяжем веб-сайт по умолчанию с протоколом TCP. Зайдите в Пуск Меню → Программы → Стандартные. Щелкните правой кнопкой мыши «Командная строка» и выберите «Запуск от имени администратора» из контекстного меню.
Выполните следующую команду —
C:\Windows\system32\inetsrv> appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.tcp',bindingInformation='808:*']
Эта команда добавляет привязку сайта net.tcp к веб-сайту по умолчанию, изменяя файл applicationHost.config, расположенный в каталоге «C: \ Windows \ system32 \ inetsrv \ config». Точно так же мы можем добавить различные протоколы на веб-сайт по умолчанию.
Создать WAS Hosted Service
Шаг 1 — Откройте Visual Studio 2008 и нажмите «Создать» → «Веб-сайт» и выберите «Служба WCF» из шаблона и «Местоположение как HTTP», как показано ниже —
Шаг 2 — Создайте договор, создав интерфейс IMathService. Добавьте атрибут ServiceContract к интерфейсу и атрибут OperationContract к объявлению метода.
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; // NOTE: You can use the "Rename" command on the "Refactor" menu to // change the interface name "IService" in both code and config file // together. [ServiceContract] Public interface IMathService { [OperationContract] int Add(int num1, int num2); [OperationContract] int Subtract(int num1, int num2); }
Шаг 3 — Реализация интерфейса IMathService показана ниже —
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; // NOTE: You can use the "Rename" command on the "Refactor" menu to // change the class name "Service" in code, svc and config file // together. Public class MathService : IMathService { Public int Add(int num1, int num2) { return num1 + num2; } Public int Subtract(int num1, int num2) { return num1 - num2; } }
Шаг 4 — Сервисный файл показан ниже.
<%@ServiceHostLanguage="C#"Debug="true"Service="MathService"CodeBehind="~/App_Code/MathService.cs"%>
Шаг 5 — В файле web.Config создайте конечную точку с привязкой ‘netTcpBinding’, и метаданные службы будут опубликованы с использованием точки обмена метаданными. Поэтому создайте конечную точку обмена метаданными с адресом «mex» и привязкой «mexTcpBinding». Без публикации метаданных службы мы не можем создать прокси, используя адрес net.tcp, например:
svcutil.exe net.tcp://localhost/WASHostedService/MathService.svc).
<?xml version = "1.0" ?> <configuration> <!-- Note: As an alternative to hand editing this file you can use the web admin tool to configure settings for your application. Use the Website->Asp.Net Configuration option in Visual Studio. A full list of settings and comments can be found in machine.config.comments usually located in \Windows\Microsoft.Net\Framework\vx.x\Config --> <configSections> <sectionGroup name = "system.web.extensions" type = "System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"> <sectionGroup name = "scripting" type = "System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken =3 1BF3856AD364E35"> <section name = "scriptResourceHandler" type = "System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "MachineToApplication"/> <sectionGroup name = "webServices" type = "System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"> <section name = "jsonSerialization" type = "System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "Everywhere"/> <section name = "profileService" type = "System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "MachineToApplication"/> <section name = "authenticationService" type = "System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "MachineToApplication"/> <section name = "roleService" type = "System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" allowDefinition = "MachineToApplication"/> </sectionGroup> </sectionGroup> </sectionGroup> </configSections> <appSettings/> <connectionStrings/> <system.web> <!-- Set compilation debug="true" to insert debugging symbols into the compiled page. Because this affects performance, set this value to true only during development. --> <compilation debug = "true"> <assemblies> <add assembly = "System.Core, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = B77A5C561934E089"/> <add assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add assembly = "System.Data.DataSetExtensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = B77A5C561934E089"/> <add assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add assembly = "System.Xml.Linq, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = B77A5C561934E089"/> </assemblies> </compilation> <!-- The <authentication> section enables configuration of the security authentication mode used by ASP.NET to identify an incoming user. --> <authentication mode="Windows"/> <!-- The <customErrors> section enables configuration of what to do if/when an unhandled error occurs during the execution of a request. Specifically, it enables developers to configure html error pages to be displayed in place of a error stack trace. <customErrors mode = "RemoteOnly" defaultRedirect = "GenericErrorPage.htm"> <error statusCode = "403" redirect = "NoAccess.htm" /> <error statusCode = "404" redirect = "FileNotFound.htm" /> </customErrors> --> <pages> <controls> <add tagPrefix = "asp" namespace = "System.Web.UI" assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add tagPrefix = "asp" namespace = "System.Web.UI.WebControls" assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> </controls> </pages> <httpHandlers> <remove verb = "*" path = "*.asmx"/> <add verb =" *" path =" *.asmx" validate="false" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add verb = "*" path = "*_AppService.axd" validate = "false" type = "System.Web.Script.Services.ScriptHandlerFactory,System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add verb = "GET,HEAD" path = "ScriptResource.axd" type = "System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35" validate = "false"/> </httpHandlers> <httpModules> <add name = "ScriptModule" type = "System.Web.Handlers.ScriptModule, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> </httpModules> </system.web> <system.codedom> <compilers> <compiler language = "c#;cs;csharp" extension = ".cs" warningLevel = "4" type = "Microsoft.CSharp.CSharpCodeProvider, System, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089"> <providerOption name = "CompilerVersion" value = "v3.5"/> <providerOption name = "WarnAsError" value = "false"/> </compiler> <compiler language = "vb;vbs;visualbasic;vbscript" extension = ".vb" warningLevel = "4" type = "Microsoft.VisualBasic.VBCodeProvider, System, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089"> <providerOption name = "CompilerVersion" value = "v3.5"/> <providerOption name = "OptionInfer" value = "true"/> <providerOption name = "WarnAsError" value = "false"/> </compiler> </compilers> </system.codedom> <!-- The system.webServer section is required for running ASP.NET AJAX under Internet Information Services 7.0. It is not necessary for previous version of IIS. --> <system.webServer> <validation validateIntegratedModeConfiguration = "false"/> <modules> <remove name = "ScriptModule"/> <add name = "ScriptModule" preCondition = "managedHandler" type = "System.Web.Handlers.ScriptModule, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> </modules> <handlers> <remove name = "WebServiceHandlerFactory-Integrated"/> <remove name = "ScriptHandlerFactory"/> <remove name = "ScriptHandlerFactoryAppServices"/> <remove name = "ScriptResource"/> <add name = "ScriptHandlerFactory" verb = "*" path = "*.asmx" preCondition = "integratedMode" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add name = "ScriptHandlerFactoryAppServices" verb = "*" path = "*_AppService.axd" preCondition = "integratedMode" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> <add name = "ScriptResource" preCondition = "integratedMode" verb = "GET,HEAD" path = "ScriptResource.axd" type = "System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/> </handlers> <!-- To browse web app root directory during debugging, set the value below to true. Set to false before deployment to avoid disclosing web app folder information. --> <directoryBrowse enabled="true"/> </system.webServer> <runtime> <assemblyBinding appliesTo = "v2.0.05727" xmlns = "urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name = "System.Web.Extensions" publicKeyToken = "31bf3856ad364e35"/> <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name = "System.Web.Extensions.Design" publicKeyToken = "31bf3856ad364e35"/> <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> <system.serviceModel> <services> <service behaviorConfiguration = "ServiceBehavior" name = "Service"> <endpoint address = "" binding = "basicHttpBinding" contract = "IMathService"> <identity> <dns value = "localhost" /> </identity> </endpoint> <endpoint address = "mex" binding = "mexHttpBinding" contract = "IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name = "ServiceBehavior"> <!-- To avoid disclosing metadata information, set the value below to false before deployment. --> <serviceMetadata httpGetEnabled="true"/> <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Разрешить разные привязки к размещенной службе
-
Перейдите в меню Пуск → Программы → Стандартные. Щелкните правой кнопкой мыши «Командная строка» и выберите «Запуск от имени администратора» из контекстного меню.
-
Выполните следующую команду —
Перейдите в меню Пуск → Программы → Стандартные. Щелкните правой кнопкой мыши «Командная строка» и выберите «Запуск от имени администратора» из контекстного меню.
Выполните следующую команду —
C:\Windows\system32\inetsrv>appcmd set app "Default Web Site/WASHostedService" /enabledProtocols:http,net.tcp
Это даст следующий результат —
WCF — Windows Service Hosting
Работа хостинга Windows-сервиса проста. Ниже приведены шаги с необходимым кодированием и скриншотами, которые объясняют процесс простым способом.
Шаг 1 — Теперь давайте создадим сервис WCF. Откройте Visual Studio 2008, нажмите «Создать» → «Проект» и выберите «Библиотека классов» из шаблона.
Шаг 2 — Добавьте ссылку System.ServiceModel в проект. Это базовая сборка, используемая для создания службы WCF.
Шаг 3 — Далее мы можем создать интерфейс ISimpleCalulator. Добавьте атрибут контракта на обслуживание и эксплуатацию, как показано ниже —
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace WindowsServiceHostedService{ [ServiceContract] public interfaceISimpleCalculator { [OperationContract] int Add(int num1, int num2); [OperationContract] int Subtract(int num1, int num2); [OperationContract] int Multiply(int num1, int num2); [OperationContract] double Divide(int num1, int num2); } }
Шаг 4 — Реализуйте интерфейс ISimpleCalculator, как показано ниже —
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowsServiceHostedService { Class SimpleCalulator : ISimpleCalculator { Public int Add(int num1, int num2) { return num1 + num2; } Public int Subtract(int num1, int num2) { return num1 - num2; } Public int Multiply(int num1, int num2) { return num1 * num2; } Public double Divide(int num1, int num2) { if (num2 != 0) return num1 / num2; else return 0; } } }
Шаг 5 — Постройте проект и получите dll. Теперь мы готовы с сервисом WCF. Мы увидим, как разместить службу WCF в службе Windows.
Примечание. В этом проекте упоминается, что мы создаем как Контракт, так и Сервис (реализацию) в одном проекте. Однако это всегда хорошая практика, если у вас есть оба в разных проектах.
Шаг 6. Откройте Visual Studio 2008, нажмите «Создать» → «Проект» и выберите «Служба Windows».
Шаг 7 — Добавьте «WindowsServiceHostedService.dll» в качестве ссылки на проект. Эта сборка будет выступать в качестве службы.
Шаг 8. Метод OnStart службы можно использовать для написания кода хостинга для WCF. Мы должны убедиться, что мы используем только один объект узла службы. Метод OnStop используется для закрытия узла службы. Следующий код показывает, как разместить службу WCF в службе Windows.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.ServiceModel; using System.ServiceModel.Description; namespace WCFHostedWindowsService { Partial class WCFHostedWindowsService : ServiceBase { ServiceHostm_Host; Public WCFHostedWindowsService() { InitializeComponent(); } Private void InitializeComponent() { thrownewNotImplementedException(); } protectedoverridevoidOnStart(string[] args) { if (m_Host != null) { m_Host.Close(); } //Create a URI to serve as the base address UrihttpUrl = newUri("http://localhost:8090/WindowsServiceHostedService/SimpleCalculator"); //Create ServiceHost m_Host = newServiceHost typeof(WindowsServiceHostedService.SimpleCalulator), httpUrl); //Add a service endpoint m_Host.AddServiceEndpoint (typeof(WindowsServiceHostedService.ISimpleCalculator), newWSHttpBinding(), ""); //Enable metadata exchange ServiceMetadataBehaviorsmb = newServiceMetadataBehavior(); smb.HttpGetEnabled = true; m_Host.Description.Behaviors.Add(smb); //Start the Service m_Host.Open(); } protectedoverridevoidOnStop() { if (m_Host != null) { m_Host.Close(); m_Host = null; } } staticvoid Main() { ServiceBase[] ServicesToRun; ServicesToRun = newServiceBase[] { newWCFHostedWindowsService(); } ServiceBase.Run(ServicesToRun); } } }
Шаг 9 — Чтобы установить службу, нам нужен класс Installer для службы Windows. Поэтому добавьте в проект новый класс Installer, который унаследован от класса Installer. Ниже приведен код, который показывает имя службы, тип запуска и т. Д. Службы.
using System; using System.Collections.Generic; using System.Text; using System.ServiceProcess; using System.Configuration.Install; using System.ComponentModel; using System.Configuration; namespace WCFHostedWindowsService { [RunInstaller(true)] Public class WinServiceInstaller : Installer { Private ServiceProcessInstaller process; Private ServiceInstaller service; Public WinServiceInstaller() { process = newServiceProcessInstaller(); process.Account = ServiceAccount.NetworkService; service = newServiceInstaller(); service.ServiceName = "WCFHostedWindowsService"; service.DisplayName = "WCFHostedWindowsService"; service.Description = "WCF Service Hosted"; service.StartType = ServiceStartMode.Automatic; Installers.Add(process); Installers.Add(service); } } }
Шаг 10 — Создайте проект, чтобы получить исполняемый файл WCFHostedWindowsService.exe. Далее нам нужно установить службу с помощью командной строки Visual Studio. Поэтому откройте командную строку, нажав Пуск → Все программы → Microsoft Visual Studio 2008 → Инструменты Visual Studio → Командная строка Visual Studio. Используя утилиту установки утилиты, вы можете установить сервис, как показано ниже.
WCF — Потребление услуг WCF
Службы WCF позволяют другим приложениям получать доступ или использовать их. Служба WCF может использоваться многими способами в зависимости от типа хостинга. Здесь мы объясняем пошаговый метод использования службы WCF для каждого из следующих популярных вариантов хостинга:
- Использование службы WCF, размещенной в IIS 5/6
- Использование службы WCF, которая размещается самостоятельно
- Использование службы WCF, размещенной в службе активации Windows
- Использование службы WCF, размещенной в службе Windows
Использование службы WCF, размещенной в IIS 5/6
Процесс использования службы WCF, размещенной в IIS 5/6, подробно обсуждается ниже. Кроме того, обсуждение включает в себя, как создавать прокси и консольные приложения.
Шаг 1. После размещения службы в IIS мы должны использовать ее в клиентских приложениях. Перед созданием клиентского приложения нам нужно создать прокси для сервиса. Этот прокси используется клиентским приложением для взаимодействия со службой. Чтобы создать прокси, запустите командную строку Visual Studio 2008. Используя служебную утилиту, мы можем создать прокси-класс и информацию о его конфигурации.
svcutilhttp: //localhost/IISHostedService/Service.svc
После выполнения этой команды мы получим два файла, сгенерированных в расположении по умолчанию.
-
MyService.cs — прокси-класс для службы WCF
-
output.config — информация о конфигурации службы
MyService.cs — прокси-класс для службы WCF
output.config — информация о конфигурации службы
Шаг 2. Теперь мы начнем создавать консольное приложение с использованием Visual Studio 2008 (клиентское приложение).
Шаг 3 — Добавьте ссылку «System.ServiceModel»; это основная библиотека для WCF.
Шаг 4 — Создайте прокси-класс.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyServiceClient { Class Program { Static void Main(string[] args) { // Creating Proxy for the MyService ServiceClient Client = newServiceClient(); Console.WriteLine("Client calling the service..."); Console.WriteLine("Hello Ram"); Console.Read(); } } }
Вывод выглядит следующим образом —
Использование автономного сервиса WCF
Здесь шаг за шагом объясняется весь процесс использования службы WCF, размещенной самостоятельно, наряду с достаточным кодированием и снимками экрана, где это необходимо.
Шаг 1 — Сервис размещен, теперь нам нужно реализовать прокси-класс для клиента. Существуют разные способы создания прокси.
-
Используя SvcUtil.exe, мы можем создать прокси-класс и его конфигурационный файл с конечными точками.
-
Добавление сервисной ссылки на клиентское приложение.
-
Реализация класса ClientBase <T>
Используя SvcUtil.exe, мы можем создать прокси-класс и его конфигурационный файл с конечными точками.
Добавление сервисной ссылки на клиентское приложение.
Реализация класса ClientBase <T>
Из этих трех методов наилучшей практикой является реализация ClientBase <T>. Если вы используете два других метода, нам нужно создавать прокси-класс каждый раз, когда мы вносим какие-либо изменения в реализацию Сервиса. Но это не относится к ClientBase <T>. Он создаст прокси только во время выполнения и позаботится обо всем.
Для этого создайте один прокси-класс, который включает ссылки System.ServiceModel и MyCalculatorService.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using MyCalculatorService; namespace MyCalculatorServiceProxy { // WCF create proxy for ISimpleCalculator using ClientBase Public class MyCalculatorServiceProxy : ClientBase<ISimpleCalculator>, ISimpleCalculator { Public int Add(int num1, int num2) { //Call base to do funtion returnbase.Channel.Add(num1, num2); } } }
Теперь создайте одно консольное приложение, которое включает ссылки System.ServiceModel и MyCalculatorServiceProxy.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using MyCalculatorServiceProxy; namespace MyCalculatorServiceClient { classProgram { Static void Main(string[] args) { MyCalculatorServiceProxy.MyCalculatorServiceProxy proxy = newMyCalculatorServiceProxy.MyCalculatorServiceProxy(); Console.WriteLine("Client is running at " + DateTime.Now.ToString()); Console.WriteLine("Sum of two numbers. 5 + 5 =" + proxy.Add(5,5)); Console.ReadLine(); } } }
Шаг 2 — Информация о конечной точке (такая же, как у сервиса) должна быть добавлена в файл конфигурации клиентского приложения.
<?xmlversion = "1.0"encoding = "utf-8" ?> <configuration> <system.serviceModel> <client> <endpoint address ="http://localhost:8090/MyCalculatorServiceProxy/ISimpleCalculator" binding = "wsHttpBinding" contract "MyCalculatorServiceProxy.ISimpleCalculator"> </endpoint> </client> </system.serviceModel> </configuration>
Шаг 3 — Перед запуском клиентского приложения необходимо запустить службу. Ниже показан вывод клиентского приложения.
Использование службы WCF, размещенной в WAS
Использование службы WCF, размещенной в WAS, — это простой процесс, включающий всего несколько шагов. Шаги следующие:
- Добавьте прокси-класс и файл конфигурации в клиентское приложение.
- Создайте объект для MathServiceClient и вызовите метод.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespaceWASHostedClient { classProgram { staticvoid Main(string[] args) { MathServiceClient client = newMathServiceClient(); Console.WriteLine("Sum of two number 5,6"); Console.WriteLine(client.Add(5, 6)); Console.ReadLine(); } } }
Вывод выглядит так, как показано ниже.
Использование службы WCF, размещенной в службе Windows
Пошаговый процесс использования службы WCF, размещенной в службе Windows, подробно описан ниже с помощью кодирования и инструкций.
После успешного размещения мы можем создать прокси-класс для службы и начать использовать его в клиентском приложении. Здесь это показано с использованием типа хостинга IIS.
Добавьте ссылку на ServiceModel.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespaceWindowServiceClient { classProgram { staticvoid Main(string[] args) { //Creating Proxy for the MyService MyServiceClient client = newMyServiceClient(); Console.WriteLine("Client calling the service..."); Console.WriteLine("Sum of two numbers 5,6"); Console.WriteLine(client.Add(5, 6)); Console.WriteLine("Subtraction of two numbers 6,5"); Console.WriteLine(client.Sub(6, 5)); Console.WriteLine("Multiplication of two numbers 6,5"); Console.WriteLine(client.Mul(6, 5)); Console.WriteLine("Division of two numbers 6,3"); Console.WriteLine(client.Div(6, 3)); Console.Read(); } } }
Вывод выглядит следующим образом —
WCF — Сервисная привязка
Привязка службы WCF представляет собой набор из нескольких элементов, каждый из которых определяет способ взаимодействия службы с клиентом. Транспортный элемент и элемент кодирования сообщения являются двумя наиболее важными компонентами каждой привязки. В этой главе мы обсудим различные часто используемые привязки службы WCF.
Базовая привязка
Базовое связывание предлагается классом BasicHttpBinding. Он использует протокол HTTP для передачи и представления службы WCF в качестве веб-службы ASP.NET (веб-службы ASMX), поэтому старые клиенты, использующие веб-службы ASMX, могут удобно использовать новые службы.
Базовая привязка устанавливается в качестве привязки по умолчанию в веб-службе WCF, включенной Silverlight, и является стандартной привязкой для связи в стиле веб-службы. Он не поддерживает надежные сообщения.
Ниже приведен фрагмент кода с настройками по умолчанию для базовой привязки.
<basicHttpBinding> <binding name = "basicHttpBindingDefaults" allowCookies = "false" bypassProxyOnLocal = "false" hostNameComparisonMode = "StrongWildcard" maxBufferPoolSize = "524288" maxBufferSize = "65536" maxReceivedMessageSize = "65536" messageEncoding = "Text" proxyAddress = "" textEncoding = "utf-8" transferMode = "Buffer" useDefaultWebProxy = "true" closeTimeout = "00:01:00" openTimeout = "00:01:00" receiveTimeout = "00:10:00" sendTimeout = "00:01:00"> <readerQuotas maxArrayLength = "16384" maxBytesPerRead = "4096" maxDepth = "32" maxNameTableCharCount = "16384" maxStringContentLength = "8192"/> <security mode = "None"> <transport clientCredentialType = "None" proxyCredentialType = "None" realm = ""/> <message algorithmSuite = "Basic256" clientCredentialType = "UserName" /> </security> </binding> </basicHttpBinding>
Приведенные выше настройки по умолчанию имеют свои очевидные ограничения, так как размер сообщения ограничен и режим безопасности отсутствует. Однако настройка базовой привязки решает эту проблему, как показано ниже.
<basicHttpBinding> <binding name = "basicHttpSecure" maxBufferSize = "100000" maxReceivedMessageSize = "100000"> <readerQuotas maxArrayLength = "100000" maxStringContentLength = "100000"/> <security mode = "TransportWithMessageCredential" /> </binding> </basicHttpBinding>
Привязка веб-службы
Привязка веб-службы (WS) обеспечивается классом WSHttpBinding. Он очень похож на базовое связывание и использует те же протоколы для транспорта, но предлагает несколько спецификаций WS– *, таких как WS-Reliable Messaging, WS-Transactions, WS-Security и многие другие. В двух словах, WSHttpBinding соответствует сумме спецификаций basicHttpBinding и WS– *. Ниже приведен фрагмент кода с настройками по умолчанию для привязки WS —
<wsHttpBinding> <binding name = "wsHttpBindingDefaults" allowCookies = "false" bypassProxyOnLocal = "false" closeTimeout = "00:01:00" hostNameComparisonMode = "StrongWildcard" maxBufferPoolSize = "524288" maxReceivedMessageSize = "65536" messageEncoding = "Text" openTimeout = "00:01:00" receiveTimeout = "00:10:00" proxyAddress = "" sendTimeout = "00:01:00" textEncoding = "utf-8" transactionFlow = "false" useDefaultWebProxy = "true" > <readerQuotas maxArrayLength = "16384" maxBytesPerRead = ."4096" maxDepth = "32" maxNameTableCharCount = "16384" maxStringContentLength = "8192"/> <reliableSession enabled = "false" ordered = "true" inactivityTimeout = "oo:10:00" /> <security mode = "Message"> <message algorithmSuite = "Basic256" clientCredentialType = "Windows" esatalishSecurityContext = "true" negotiateServiceCredential = "true" /> <transport clientCredentialType = "Windows" proxyCredentialType = "None" realm = ""/> </security> </binding> </wsHttpBinding>
IPC Binding
Привязка IPC использует именованный канал и предлагается классом netNamedPipeBinding. Это самая быстрая и самая безопасная привязка среди всех доступных привязок. Хотя безопасность на уровне сообщений здесь не поддерживается, сообщения по умолчанию защищены из-за надежной транспортной безопасности. Ниже приведен фрагмент кода, отображающий настройки по умолчанию для привязки IPC —
<netNamedPipeBinding> <binding name = "netPipeDefaults" closeTimeout = "00:01:00" hostNameComparisonMode = "StrongWildcard" maxBufferPoolSize = "524288" maxBufferSize = "65536" maxConnections = "10" maxReceivedMessageSize = "65536" openTimeout = "00:01:00" receiveTimeout = "00:10:00" sendTimeout = "00:01:00" transactionFlow = "false" transactionProtocol = "OleTransactions" transferMode = "Buffered"> <readerQuotas maxArrayLength = "16384" maxBytesPerRead = "4096" maxDepth = "32" maxNameTableCharCount = "16384" maxStringContentLength = "8192"/> <security mode = "Transport"> </security> </binding> </netNamedPipeBinding>
Другие типы сервисных привязок
-
Привязка TCP — Предоставляется классом NetTCPBinding, эта привязка использует протокол TCP для связи в той же сети и выполняет кодирование сообщений в двоичном формате. Это связывание считается наиболее надежным в отличие от других.
-
Двойная привязка WS — этот тип привязки больше похож на WSHttpBinding с единственным исключением, что он облегчает двунаправленную связь, то есть сообщения могут отправляться и приниматься как клиентами, так и службами. Он предлагается классом WSDualHttpBinding.
-
Веб-привязка — Веб-привязка предназначена для представления служб WCF в форме HTTP-запросов с использованием HTTP-GET, HTTP-POST и т. Д. Она предлагается классом WebHttpBinding и широко используется в социальных сетях.
-
Привязка MSMQ — предлагается классом NetMsmqBinding и используется для предоставления решений в случае, если служба обрабатывает сообщение в другое время, отличное от отправленного клиентом. Привязка MSMQ использует MSMQ для транспортировки и обеспечивает поддержку отдельного сообщения, помещенного в очередь. MSMQ — это реализация очереди сообщений, предлагаемая Microsoft.
-
Федеративное связывание WS — это особая форма связывания WS, предлагающая поддержку федеративной безопасности. Он предлагается классом WSFederationHttpBinding.
-
Привязка к одноранговой сети — предлагается классом NetPeerTCPBinding, в основном используется в системах общего доступа к файлам. Он использует протокол TCP, но использует одноранговые сети в качестве транспорта. В этой сети каждый компьютер (узел) действует как клиент и сервер для других узлов. Привязка к одноранговой сети используется в системах обмена файлами, таких как торрент.
-
Привязка интеграции MSMQ — Предлагается классом MsmqIntegrationBinding, она помогает взаимодействовать с существующими системами, которые обмениваются данными через MSMQ (Microsoft Message Queuing).
Привязка TCP — Предоставляется классом NetTCPBinding, эта привязка использует протокол TCP для связи в той же сети и выполняет кодирование сообщений в двоичном формате. Это связывание считается наиболее надежным в отличие от других.
Двойная привязка WS — этот тип привязки больше похож на WSHttpBinding с единственным исключением, что он облегчает двунаправленную связь, то есть сообщения могут отправляться и приниматься как клиентами, так и службами. Он предлагается классом WSDualHttpBinding.
Веб-привязка — Веб-привязка предназначена для представления служб WCF в форме HTTP-запросов с использованием HTTP-GET, HTTP-POST и т. Д. Она предлагается классом WebHttpBinding и широко используется в социальных сетях.
Привязка MSMQ — предлагается классом NetMsmqBinding и используется для предоставления решений в случае, если служба обрабатывает сообщение в другое время, отличное от отправленного клиентом. Привязка MSMQ использует MSMQ для транспортировки и обеспечивает поддержку отдельного сообщения, помещенного в очередь. MSMQ — это реализация очереди сообщений, предлагаемая Microsoft.
Федеративное связывание WS — это особая форма связывания WS, предлагающая поддержку федеративной безопасности. Он предлагается классом WSFederationHttpBinding.
Привязка к одноранговой сети — предлагается классом NetPeerTCPBinding, в основном используется в системах общего доступа к файлам. Он использует протокол TCP, но использует одноранговые сети в качестве транспорта. В этой сети каждый компьютер (узел) действует как клиент и сервер для других узлов. Привязка к одноранговой сети используется в системах обмена файлами, таких как торрент.
Привязка интеграции MSMQ — Предлагается классом MsmqIntegrationBinding, она помогает взаимодействовать с существующими системами, которые обмениваются данными через MSMQ (Microsoft Message Queuing).
Помимо этого, также возможно создание пользовательских привязок. Однако, поскольку можно настроить свойства конфигурации каждой привязки WCF, необходимость создания пользовательских привязок возникает редко.
WCF — Управление экземплярами
Набор методов, используемых WCF для привязки набора сообщений (клиентских запросов) к экземплярам службы, известен как Управление экземплярами. WCF поддерживает три типа активации экземпляров, и они обсуждаются в этой главе.
Per-Call Service
Служба на основе вызова — это режим активации экземпляра по умолчанию для WCF. Когда служба WCF настроена для службы для каждого вызова, объект CLR создается для промежутка времени, в течение которого выполняется вызов или запрос клиента. CLR обозначает Common Language Runtime и включает экземпляры служб в WCF.
В услуге для каждого вызова каждый клиентский запрос достигает нового выделенного экземпляра службы, и его потребление памяти меньше по сравнению с другими типами активации экземпляра.
Свойство InstanceContextMode должно быть установлено равным InstanceContextMode.PerCall, чтобы указать, что служба WCF действует как служба для каждого вызова. Свойство InstanceContextMode принадлежит атрибуту ServiceBehavior. Следовательно, услуга для каждого вызова может быть настроена следующим образом:
[ServiceContract] interface IMyContract {...} [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)] class MyService : IMyContract {...}
Сервис здесь выражается как IMyContract. На следующем рисунке показан процесс активации экземпляра службы для каждого вызова.
Внедрение услуги по вызову
[DataContract] class Param {....} [ServiceContract] interface IMyContract { [OperationContract] void MyMethod(Param objectIdentifier); } class MyPerCallService : IMyContract, IDisposable { public void MyMethod(Param objectIdentifier) { GetState(objectIdentifier); DoWork(); SaveState(objectIdentifier); } void GetState(Param objectIdentifier) {....} void DoWork() {....} void SaveState(Param objectIdentifier) {....} public void Dispose() {....} }
Здесь Param — параметр псевдотипа, изобретенный для вышеприведенного примера.
Per-Session Service
В этом режиме активации WCF между двумя объектами, то есть клиентом и конкретным экземпляром службы, поддерживается конфиденциальный или, можно сказать, конфиденциальный сеанс. Также известная как служба частного сеанса, служба для каждого сеанса предлагает новый экземпляр службы, который остается выделенным для каждого запроса клиента и независимым от всех других экземпляров, относящихся к этой службе, поддерживающей сеанс.
Чтобы инициировать сеансовую службу, для свойства InstanceContextMode необходимо установить значение PerSession. Здесь экземпляр службы остается в памяти на протяжении всего сеанса.
Режим активации страдает от масштабируемости, поскольку сконфигурированная служба не может поддерживать какие-либо дополнительные выдающиеся клиенты, кроме нескольких (или, может быть, до нескольких сотен) из-за стоимости каждого отдельного экземпляра службы.
Сервис для каждой сессии может быть настроен как —
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)] class MyService : IMyContract {...}
Процесс обслуживания за сеанс может быть описан, как показано на следующем рисунке —
В следующем коде показан контракт и служба, настроенная для использования частного сеанса. Вывод указывает, что клиент действительно получил выделенный экземпляр службы.
Сервисный код
[ServiceContract(Session = true)] interface IMyContract { [OperationContract] void MyMethod(); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] class MyService : IMyContract, IDisposable { int m_Counter = 0; MyService() {Console.WriteLine("MyService.MyService()"); } public void MyMethod() { m_Counter++; Console.WriteLine("Counter = " + m_Counter); } public void Dispose() { Console.WriteLine("MyService.Dispose()"); } }
Код клиента
MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod(); proxy.Close();
Выход
MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()
Синглтон Сервис
В этом режиме активации WCF все клиентские запросы, независимые друг от друга, подключаются к одному и тому же общеизвестному отдельному экземпляру независимо от их подключения к конечным точкам службы. Синглтон-сервис удаляется только тогда, когда хост закрывается.
Этот сервис создается только один раз при создании хоста. В случае, если хосту не предоставлен какой-либо одноэлементный экземпляр, сервис возвращается как NULL. Режим активации наиболее эффективен, когда объем работы в каждом вызове метода невелик и в фоновом режиме нет ожидающих операций.
Свойство InstanceContextMode необходимо установить в InstanceContextMode.Single, чтобы инициировать эту службу Singleton.
Следовательно, услуга Singleton может быть настроена как —
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] class MySingleton : ... {...}
Процесс обслуживания Singleton показан на следующем рисунке —
Следующий код используется для инициализации и размещения экземпляра синглтона.
Сервисный код
[ServiceContract] interface IMyContract { [OperationContract] void MyMethod( ); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] class MySingleton : IMyContract { int m_Counter = 0; public int Counter { get { return m_Counter; } set { m_Counter = value; } } public void MyMethod( ) { m_Counter++; Trace.WriteLine("Counter = " + Counter); } }
Код хоста
MySingleton singleton = new MySingleton( ); singleton.Counter = 42; ServiceHost host = new ServiceHost(singleton); host.Open( ); //Do some blocking calls then host.Close( );
Код клиента
MyContractClient proxy = new MyContractClient( ); proxy.MyMethod( ); proxy.Close( );
Выход
Counter = 43
WCF — Сделки
Транзакция в WCF — это набор операций, которые следуют некоторым свойствам, которые в совокупности известны как ACID. Здесь, если происходит сбой одной операции, происходит сбой всей системы автоматически. Когда заказ размещен онлайн, происходит транзакция. Следующий пример может быть полезен для понимания процесса транзакции в более простых терминах.
пример
Предположим, вы заказали ЖК-телевизор в интернет-магазине и собираетесь оплатить сумму кредитной картой. Когда вы вводите необходимую информацию для размещения заказа, две операции происходят одновременно.
Во-первых, указанная сумма списывается с вашего банковского счета, а во-вторых, на счет поставщика зачисляется такая же сумма. Обе операции должны выполняться успешно, чтобы иметь успешную транзакцию.
Свойства транзакции WCF
Вот четыре свойства, за которыми следует транзакция WCF:
-
Атомарный — все операции должны действовать как единая неделимая операция при завершении транзакции.
-
Согласованность — какой бы ни была заданная операция, система всегда находится в состоянии согласованности, т. Е. Результат транзакции всегда соответствует ожидаемому.
-
Изоляция — промежуточное состояние системы невидимо ни для каких сущностей внешнего мира до завершения транзакции.
-
Долговечность — подтвержденное состояние поддерживается независимо от любого вида сбоя (аппаратное обеспечение, отключение питания и т. Д.)
Атомарный — все операции должны действовать как единая неделимая операция при завершении транзакции.
Согласованность — какой бы ни была заданная операция, система всегда находится в состоянии согласованности, т. Е. Результат транзакции всегда соответствует ожидаемому.
Изоляция — промежуточное состояние системы невидимо ни для каких сущностей внешнего мира до завершения транзакции.
Долговечность — подтвержденное состояние поддерживается независимо от любого вида сбоя (аппаратное обеспечение, отключение питания и т. Д.)
При настройке транзакции WCF необходимо учитывать некоторые факторы. Это обязательное и эксплуатационное поведение.
Привязка — привязок, поддерживающих транзакции в WCF, очень мало, и крайне важно сделать выбор только из этих привязок, которые по умолчанию остаются отключенными и должны быть включены для получения необходимой поддержки транзакции. Эти привязки следующие:
- NetTcpBinding
- NetNamedPipeBinding
- WsHttpBinding
- WSDualHttpBinding
- WSFederationHttpBinding
Поведение операции. В то время как привязка облегчает путь для распространения транзакции, операция заботится об обработке транзакции, а также о конфигурации операции. Поведение операции в основном использует два атрибута: TransactionFlow и TransactionScopeRequired. Здесь следует отметить, что TransactionFlow имеет в основном три значения, а именно: Разрешено, Обязательное и Не разрешено.
Следующий код показывает, облегчает ли изменение конфигурации привязки и контракта операции распространение клиента.
<bindings> <wsHttpBinding> <binding name = "MandatoryTransBinding" transactionFlow = "true"> <reliableSession enabled ="true"/> </binding> </wsHttpBinding> </bindings>
Протокол транзакций
WCF использует три типа протоколов для транзакций —
- облегченный
- Оле Транзакция
- WS-Атомная транзакция (WS-AT)
WS-AT является функционально совместимым протоколом и обеспечивает поток распределенных транзакций через брандмауэры. Однако этот протокол не следует использовать, если транзакция строго основана на технологии Microsoft.
Этапы транзакции WCF
В транзакции WCF есть две фазы, как показано на следующем рисунке.
-
Этап подготовки — на этом этапе менеджер транзакций проверяет, готовы ли все объекты принять транзакцию или нет.
-
Фаза фиксации — На этом этапе приверженность сущностей начинается в реальности.
Этап подготовки — на этом этапе менеджер транзакций проверяет, готовы ли все объекты принять транзакцию или нет.
Фаза фиксации — На этом этапе приверженность сущностей начинается в реальности.
На следующем рисунке показаны функции обеих фаз транзакции WCF.
Включение транзакции WCF
Чтобы успешно включить транзакцию WCF, необходимо последовательно выполнить последовательность из шести шагов. Необходимые шаги обсуждаются ниже.
Шаг 1 — Создание двух сервисов WCF
Первым шагом в этом отношении является создание двух сервисных проектов в WCF для участия в одной транзакции. Транзакции базы данных будут выполняться в обеих этих службах, и будет понятно, что они объединены транзакцией WCF. Веб-приложение WCFTransactions также было создано для использования двух созданных сервисов в одной области транзакции.
Шаг 2 — Создание метода и его атрибуция с атрибутом TransactionFlow
Здесь будет создан метод UpdateData для обеих служб WCF для вставки в базу данных с атрибутом OperationContract. Для выполнения этой задачи сначала создается интерфейсный класс с помощью атрибута ServiceContract. Для включения транзакции во вновь созданном методе она связывается с TransactionFlow, и транзакции разрешены с использованием значения Allowed.
[ServiceContract] public interface IService1 { [OperationContract] [TransactionFlow(TransactionFlowOption.Allowed)] void UpdateData(); }
Шаг 3 — Внедрение службы WCF с атрибутом TransactionScopeRequired
Это делается с помощью кода, показанного ниже —
[OperationBehavior(TransactionScopeRequired = true)] public void UpdateData() { try { SqlConnection objConnection = new SqlConnection(strConnection); objConnection.Open(); using(SqlTransaction transaction = Program.dbConnection.BeginTransaction()) { Boolean doRollback = false; using(SqlCommand cmd = new SqlCommand( "insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection)) try { cmd.ExecuteNonQuery(); } catch(SqlException) { doRollback = true; break; } } if(doRollback) transaction.Rollback(); else transaction.Commit(); } finally { objConection.Close(); } }
Шаг 4 — Включение потока транзакций с помощью файла конфигурации службы WCF
Его кодирование выполняется следующим образом:
<bindings> <wsHttpBinding> <binding name = "TransactionalBind" transactionFlow = "true"/> </wsHttpBinding> </bindings>
Крайне важно прикрепить допустимую привязку транзакции к конечной точке, чтобы предоставить сервис WCF.
<endpoint address = "" binding = "wsHttpBinding" bindingConfiguration = "TransactionalBind" contract = "WcfService1.IService1">
Шаг 5 — Вызов обоих сервисов в одной транзакции
Здесь вышеупомянутые две службы вызываются в одной транзакции, и для этой цели объект TransactionScope используется для группировки обеих служб. Метод Complete указанного выше объекта вызывается для фиксации транзакции WCF. Для отката необходимо вызвать метод Dispose.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) { try { // Call your webservice transactions here ts.Complete(); } catch (Exception ex) { ts.Dispose(); } }
Небольшой фрагмент полного кода, в котором транзакции WCF сгруппированы в одной области видимости, изображен ниже —
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) { try { ServiceReference1.Service1Client obj = newServiceReference1.Service1Client(); obj.UpdateData(); ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client(); obj1.UpdateData(); ts.Complete(); } catch (Exception ex) { ts.Dispose(); } }
Шаг 6 — Тестирование транзакции WCF
Тестирование выполняется на 6-м и последнем шаге, и после вызова 1-й службы WCF возникает исключение.
WCF — Риа Сервисес
WCF RIA Service — это инфраструктура более высокого уровня и новый компонент таких платформ, как .NET 4 и Silverlight 4, который упрощает процедуру создания сложного бизнес-приложения в Silverlight, предлагая проверку на стороне клиента. РИА выступает за богатые интернет-приложения.
Здесь следует отметить, что Silverlight — это платформа, предлагаемая Microsoft, которая идеально подходит для многофункциональных интернет-приложений и доступна для использования в качестве подключаемого модуля браузера, как и Adobe Flash.
Служба WCF RIA в основном основана на стандартной версии службы WCF. На следующем рисунке показана часть архитектуры WCF, на которой в основном сосредоточены службы RIA WCF.
Создание службы WCF RIA — это следующий шаг для лучшего понимания концепции. Пошаговая процедура приведена ниже.
Шаг 1. Создайте новый веб-проект с именем SLWCFRiaServices.Web с помощью Silverlight 5, а затем добавьте новый элемент, выбрав в нем модель данных объекта ADO.NET.
Шаг 2. Теперь выберите содержимое модели в мастере Entity Data Model Wizard, сгенерировав модель из базы данных.
Шаг 3 — Из того же мастера выберите подключение к данным и объекты базы данных.
Шаг 4. Создайте решение так, чтобы в будущем распознавание модели данных не стало проблемой для доменной службы, которую вы собираетесь создать.
Шаг 5 — Теперь создайте доменную службу в веб-проекте, добавив новый элемент и убедитесь, что клиентский доступ включен.
Шаг 6 — На следующем шаге будут сгенерированы некоторые классы, и важно создать их заново.
Шаг 7 — На этом шаге DataDomainContext отображается на панели источников данных.
Шаг 8 — На этом шаге статья под DataDomainContext должна быть выбрана и настроена.
Шаг 9 — Присоединение элемента управления DataGrid к источнику данных — это совершенный шаг, а также выбор тем. Здесь выбрана тема BureauBlue.
Шаг 10. Последний и последний шаг состоит из перехода на экран дизайна и добавления объекта в область макета главной страницы простым перетаскиванием. Также очень важно обеспечить AutoGenerateColumns = «True» и запустить его для просмотра выходных данных.
Предпосылки
Есть несколько предпосылок для того, чтобы полностью использовать потенциал сервисов RIA WCF —
- Visual Studio 2010 / Visual Studio 2012
- Среда разработки Silverlight
- Последняя версия RIA Services Toolkit
- SDK (комплект разработки программного обеспечения)
Доменная служба WCF RIA
Доменная служба состоит из набора операций с данными, связанных с бизнесом. Это всего лишь служба WCF, которая предоставляет бизнес-логику любого приложения службы WCF RIA.
Доменная служба WCF RIA имеет внутренний класс хостинга DomainServiceHost, который, в свою очередь, использует класс WCF ServiceHost для размещения приложения. Чтобы сделать службу домена доступной для клиентского проекта, она должна иметь атрибут EnableClientAccessAttribute. Атрибут применяется автоматически каждый раз, когда добавляется новый класс обслуживания домена.
На следующем рисунке показана архитектура доменной службы WCF RIA.
Услуги WCF RIA — Запрос данных
На следующем рисунке показано, как запрос создается на стороне клиента и выполняется на стороне сервера для возврата запрашиваемых результатов. DAL обозначает Уровень доступа к данным.
WCF RIA Services — Обновление данных
На следующем рисунке показано, как данные обновляются путем выполнения операции CUD (Create Update Delete) на стороне сервера. Здесь следует отметить, что служба WCF RIA всегда находится на сервере без сохранения состояния.
WCF — Безопасность
Служба WCF может похвастаться надежной системой безопасности с двумя режимами или уровнями безопасности, так что только предполагаемый клиент может получить доступ к службам. Угрозы безопасности, которые распространены в распределенной транзакции, в значительной степени смягчены WCF.
Ключевые функции безопасности
Служба WCF имеет четыре ключевых функции безопасности, как показано на рисунке ниже.
-
Аутентификация — здесь аутентификация не ограничивается идентификацией отправителя сообщения, а является взаимной, т. Е. Аутентификация получателя сообщения требуется для исключения возможности любого рода атак со стороны посредника.
-
Авторизация — это следующий шаг, предпринятый службой WCF для обеспечения безопасности, и здесь определяется, должна ли служба авторизовать вызывающую программу для продолжения или нет. Хотя авторизация не зависит от аутентификации, она обычно следует за аутентификацией.
-
Конфиденциальность — обмен информацией между вызывающим абонентом и службой является конфиденциальным, чтобы ограничить его толкование другими лицами, для которых сообщение не предназначено. Чтобы сделать это возможным, шифрование используется вместе с множеством других механизмов.
-
Целостность . Последняя ключевая концепция — сохранение целостности, т. Е. Предоставление гарантии того, что сообщение не было подделано кем-либо на пути от отправителя к получателю.
Аутентификация — здесь аутентификация не ограничивается идентификацией отправителя сообщения, а является взаимной, т. Е. Аутентификация получателя сообщения требуется для исключения возможности любого рода атак со стороны посредника.
Авторизация — это следующий шаг, предпринятый службой WCF для обеспечения безопасности, и здесь определяется, должна ли служба авторизовать вызывающую программу для продолжения или нет. Хотя авторизация не зависит от аутентификации, она обычно следует за аутентификацией.
Конфиденциальность — обмен информацией между вызывающим абонентом и службой является конфиденциальным, чтобы ограничить его толкование другими лицами, для которых сообщение не предназначено. Чтобы сделать это возможным, шифрование используется вместе с множеством других механизмов.
Целостность . Последняя ключевая концепция — сохранение целостности, т. Е. Предоставление гарантии того, что сообщение не было подделано кем-либо на пути от отправителя к получателю.
Режим безопасности передачи
WCF предлагает следующие режимы безопасности передачи, чтобы обеспечить защищенную связь между клиентом и сервером. Различные режимы безопасности передачи упомянуты ниже.
-
Нет. Этот режим не гарантирует никакой безопасности сообщений, и служба не получает учетные данные о клиенте. Этот режим очень рискованный, поскольку может допускать подделку сообщений и, следовательно, не рекомендуется.
Нет. Этот режим не гарантирует никакой безопасности сообщений, и служба не получает учетные данные о клиенте. Этот режим очень рискованный, поскольку может допускать подделку сообщений и, следовательно, не рекомендуется.
<wsHttpBinding> <binding name = "WCFSecurityExample"> <security mode = "None"/> </binding> </wsHttpBinding>
-
Транспорт. Этот режим является наиболее простым способом обеспечения безопасной передачи сообщений с использованием протоколов связи, таких как TCP, IPC, Https и MSMQ. Этот режим более эффективен, когда передача является двухточечной и используется в основном в контролируемой среде, то есть в приложениях интрасети.
Транспорт. Этот режим является наиболее простым способом обеспечения безопасной передачи сообщений с использованием протоколов связи, таких как TCP, IPC, Https и MSMQ. Этот режим более эффективен, когда передача является двухточечной и используется в основном в контролируемой среде, то есть в приложениях интрасети.
<wsHttpBinding> <binding name = "WCFSecurityExample"> <security mode = "Transport"/> </binding> </wsHttpBinding>
-
Сообщение — режим безопасности обеспечивает взаимную аутентификацию и в значительной степени обеспечивает конфиденциальность, поскольку сообщения зашифрованы и могут передаваться через http, который не считается безопасным протоколом. Здесь безопасность обеспечивается сквозной без учета того, сколько посредников вовлечено в передачу сообщения и есть ли защищенный транспорт или нет. Режим обычно используется интернет-приложениями.
Сообщение — режим безопасности обеспечивает взаимную аутентификацию и в значительной степени обеспечивает конфиденциальность, поскольку сообщения зашифрованы и могут передаваться через http, который не считается безопасным протоколом. Здесь безопасность обеспечивается сквозной без учета того, сколько посредников вовлечено в передачу сообщения и есть ли защищенный транспорт или нет. Режим обычно используется интернет-приложениями.
<wsHttpBinding> <binding name = "WCFSecurityExample"> <security mode = "Message"/> </binding> </wsHttpBinding>
-
Смешанный — этот режим безопасности используется не часто, и аутентификация клиента предлагается только на уровне клиента.
Смешанный — этот режим безопасности используется не часто, и аутентификация клиента предлагается только на уровне клиента.
<wsHttpBinding> <binding name = "WCFSecurityExample"> <security mode = "TransportWithMessageCredential"/> </binding> </wsHttpBinding>
-
И то и другое. Этот режим безопасности включает в себя как транспортную безопасность, так и безопасность сообщений, чтобы обеспечить надежную защиту, но часто приводит к перегрузке общей производительности. Этот поддерживается только MSMQ.
И то и другое. Этот режим безопасности включает в себя как транспортную безопасность, так и безопасность сообщений, чтобы обеспечить надежную защиту, но часто приводит к перегрузке общей производительности. Этот поддерживается только MSMQ.
<netMsmqBinding> <binding name = "WCFSecurityExample"> <security mode = "Both"/> </binding> </netMsmqBinding>
Все привязки WCF, кроме BasicHttpBinding, имеют некоторую степень безопасности передачи по умолчанию.
Уровень безопасности сообщений
Безопасность на уровне сообщений не зависит от протоколов WCF. Он используется с самими данными сообщения путем шифрования данных с использованием стандартного алгоритма. Ряд учетных данных клиента доступны для разных привязок для уровня безопасности сообщений, и они обсуждаются ниже.
Учетные данные клиента для безопасности на уровне сообщений в WCF
Нет — здесь для защиты сообщения используется шифрование, в то время как аутентификация клиента не выполняется, что означает, что сервис может быть доступен анонимному клиенту. За исключением BasicHttpBinding, все привязки WCF поддерживают эти учетные данные клиента. Однако следует отметить, что для NetNamedPipeBinding эти учетные данные клиента вообще не доступны.
-
Windows — здесь для пользователя, вошедшего в систему в режиме реального времени, используется шифрование сообщений и аутентификация клиента. В этом случае, в отличие от всех других привязок WCF, NetNamedPipeBinding недоступен, а BasicHttpBinding не поддерживает его.
-
Имя пользователя — здесь сообщения шифруются, а также защищаются, предлагая имя пользователя, и клиенты проходят проверку подлинности, поскольку они должны предложить пароль. BasicHttpBinding, как и два вышеуказанных учетных данных клиента, не поддерживает имя пользователя и недоступно для NetNamedPipeBinding.
-
Сертификат — наряду с шифрованием сообщений и клиент, и служба получают аутентификацию с помощью сертификата. Эти учетные данные клиента доступны и поддерживаются всеми привязками WCF, кроме NetNamedPipeBinding.
-
IssuedToken — выданные токены от таких авторитетов, как Cardspace, используются для аутентификации сообщений. Шифрование сообщений также выполняется здесь.
Windows — здесь для пользователя, вошедшего в систему в режиме реального времени, используется шифрование сообщений и аутентификация клиента. В этом случае, в отличие от всех других привязок WCF, NetNamedPipeBinding недоступен, а BasicHttpBinding не поддерживает его.
Имя пользователя — здесь сообщения шифруются, а также защищаются, предлагая имя пользователя, и клиенты проходят проверку подлинности, поскольку они должны предложить пароль. BasicHttpBinding, как и два вышеуказанных учетных данных клиента, не поддерживает имя пользователя и недоступно для NetNamedPipeBinding.
Сертификат — наряду с шифрованием сообщений и клиент, и служба получают аутентификацию с помощью сертификата. Эти учетные данные клиента доступны и поддерживаются всеми привязками WCF, кроме NetNamedPipeBinding.
IssuedToken — выданные токены от таких авторитетов, как Cardspace, используются для аутентификации сообщений. Шифрование сообщений также выполняется здесь.
В следующем коде показано, как настраиваются учетные данные клиента в уровне / режиме безопасности сообщений WCF.
<netTcpBinding> <binding name = "WCFMessageSecurityExample"> <security mode = "Message"> <message clientCredentialType = "None"/> </security> </binding> </netTcpBinding> <netMsmqBinding>...</netMsmqBinding> </bindings> <behaviors>...</behaviors>
Здесь следует отметить, что режим безопасности транспорта имеет преимущество над уровнем безопасности сообщений, поскольку первый режим быстрее. Он не требует никакого дополнительного кодирования и предлагает поддержку взаимодействия, и, следовательно, не снижает общую производительность.
Однако с точки зрения безопасности режим защиты сообщений является более надежным, независимым от протоколов и обеспечивает сквозную безопасность.
WCF — обработка исключений
Разработчик службы WCF может столкнуться с некоторыми непредвиденными ошибками, которые требуют сообщения клиенту подходящим способом. Такие ошибки, известные как исключения , обычно обрабатываются с помощью блоков try / catch, но, опять же, это зависит от конкретной технологии.
Поскольку проблемная область клиента связана не с тем, как произошла ошибка, или с факторами, способствующими ошибке, контракт отказа от SOAP используется для передачи сообщения об ошибке из сервиса клиенту в WCF.
Контракт отказа позволяет клиенту иметь документированное представление ошибок, произошедших в службе. Следующий пример дает лучшее понимание.
Шаг 1 — Создан простой сервис калькулятора с операцией деления, которая генерирует общие исключения.
using System; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Runtime.Serialization; usingSystem.ServiceModel; usingSystem.Text; namespace Calculator { // NOTE: You can use the "Rename" command on the "Refactor" menu to change // the interface name "IService1" in both code and config file together. [ServiceContract] public interface IService1 { [OperationContract] int divide(int num1, int num2); // TODO: Add your service operations here } }
Кодировка для файла класса показана ниже —
Теперь, когда мы попытаемся разделить число 10 на ноль, служба калькулятора выдаст исключение.
Исключение может быть обработано блоком try / catch.
Теперь, когда мы попытаемся разделить любое целое число на 0, оно вернет значение 10, потому что мы обработали его в блоке catch.
Шаг 2 — FaultException используется на этом шаге для передачи информации об исключении клиенту из службы.
public int Divide(int num1, int num2) { //Do something throw new FaultException("Error while dividing number"); }
Шаг 3 — Можно также создать пользовательский тип для отправки сообщения об ошибке с помощью FaultContract. Шаги, необходимые для создания пользовательского типа, упомянуты ниже —
Тип определяется использованием контракта данных и указываются поля, предназначенные для получения.
Сервисная операция оформлена атрибутом FaultContract. Имя типа также указано.
Экземпляр службы создается для создания исключений, и назначаются настраиваемые свойства исключений.