Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Приложения используют клиентские объекты Windows Communication Foundation (WCF) для вызова операций службы. В этом разделе рассматриваются клиентские объекты WCF, каналы клиента WCF и их связи с базовой архитектурой каналов. Общие сведения о клиентских объектах WCF см. в обзоре клиента WCF. Дополнительные сведения о слое канала см. в разделе "Расширение уровня канала".
Обзор
Время выполнения модели обслуживания создает клиентов WCF, которые включают в себя следующие компоненты:
Автоматическая реализация клиентского контракта службы, которая преобразует вызовы из кода приложения в исходящие сообщения и преобразует ответные сообщения в выходные параметры и возвращает значения, которые может получить приложение.
Реализация интерфейса управления (System.ServiceModel.IClientChannel), которая объединяет различные интерфейсы и предоставляет доступ к функциям управления, в частности возможность закрытия сеанса клиента и удаления канала.
Клиентский канал, созданный на основе параметров конфигурации, указанных используемой привязкой.
Приложения могут создавать такие клиенты по требованию либо путем System.ServiceModel.ChannelFactory создания экземпляра производного класса, так как он создается ClientBase<TChannel> ServiceModel (Svcutil.exe). Эти готовые классы клиентов инкапсулируют и делегируют реализацию клиентского канала, которая динамически создается с помощью ChannelFactory. Таким образом, клиентский канал и фабрика каналов, которые производят их, являются основной точкой интереса для этого обсуждения.
Клиентские объекты и клиентские каналы
Базовый интерфейс клиентов WCF — это System.ServiceModel.IClientChannel интерфейс, который предоставляет основные функции клиента, а также основные функции System.ServiceModel.ICommunicationObjectSystem.ServiceModel.IContextChannelобъекта коммуникации, функции контекста и расширяемое поведениеSystem.ServiceModel.IExtensibleObject<T>.
Однако IClientChannel интерфейс не определяет сам контракт службы. Они объявляются интерфейсом контракта службы (обычно создаются из метаданных службы с помощью такого средства, как Средство работы с метаданными ServiceModel (Svcutil.exe)). Типы клиентов WCF расширяют как IClientChannel, так и целевой интерфейс контракта службы, чтобы приложения могли напрямую вызывать операции и получать доступ к функциям выполнения на стороне клиента. Создание клиента WCF предоставляет объектам WCFSystem.ServiceModel.ChannelFactory сведения, необходимые для создания времени выполнения, которое может подключаться к настроенной служебной конечной точке и взаимодействовать с ней.
Как упоминалось ранее, перед их использованием необходимо настроить два типа клиентов WCF. Простейшие типы клиентов WCF — это объекты, производные от ClientBase<TChannel> (или DuplexClientBase<TChannel> если контракт службы является дуплексным контрактом). Эти типы можно создать с помощью конструктора, настроенного программным способом или с помощью файла конфигурации, а затем вызвать непосредственно для вызова операций службы. Общие сведения об объектах ClientBase<TChannel> см. в обзоре клиента WCF.
Второй тип создается во время выполнения вызовом метода CreateChannel. Приложения, которые ориентированы на строгий контроль над спецификой коммуникаций, обычно используют этот тип клиента, называемый объектом клиентского канала, поскольку он обеспечивает более непосредственное взаимодействие по сравнению с базовой системой выполнения и системой каналов клиента.
Фабрики каналов
Класс, отвечающий за создание базового времени выполнения, поддерживающего вызовы клиента, является классом System.ServiceModel.ChannelFactory<TChannel> . Как клиентские объекты WCF, так и объекты клиентского канала WCF используют объект ChannelFactory<TChannel> для создания экземпляров. Объект производного клиента ClientBase<TChannel> инкапсулирует обработку фабрики каналов, однако в ряде сценариев вполне разумно использовать фабрику каналов непосредственно. Распространенный сценарий заключается в том, чтобы многократно создавать новые клиентские каналы из существующей фабрики. При использовании клиентского объекта можно получить базовую фабрику каналов из клиентского объекта WCF, используя свойство ClientBase<TChannel>.ChannelFactory.
Важно запомнить, что фабрики каналов создают новые экземпляры клиентских каналов на основе конфигурации, предоставленной им перед вызовом ChannelFactory<TChannel>.CreateChannel. После вызова CreateChannel (или ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel или любой другой операции в клиентском объекте WCF), вы не сможете изменить фабрику каналов и ожидать получения каналов к разным экземплярам служб, даже если вы просто изменяете целевой адрес конечной точки. Если вы хотите создать клиентский объект или канал клиента с другой конфигурацией, сначала необходимо создать фабрику каналов.
Дополнительные сведения о различных проблемах с использованием клиентских объектов WCF и каналов клиента WCF см. в разделе Accessing Services Using a WCF Client.
В следующих двух разделах описывается создание и использование объектов клиентского канала WCF.
Создание объекта клиентского канала WCF
Чтобы проиллюстрировать использование клиентского канала, предположим, что был создан следующий контракт службы.
[System.ServiceModel.ServiceContractAttribute(
Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
[System.ServiceModel.OperationContractAttribute(
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
typeof(microsoft.wcf.documentation.SampleFault),
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);
}
Чтобы подключиться к ISampleService
службе, используйте созданный интерфейс контракта непосредственно с фабрикой каналов (ChannelFactory<TChannel>). После того как вы создадите и настроите фабрику каналов для определенного контракта, вы можете вызвать метод CreateChannel, чтобы вернуть объекты клиентского канала, которые можно использовать для взаимодействия со службой ISampleService
.
При использовании класса ChannelFactory<TChannel> с интерфейсом контракта службы необходимо явно привести к интерфейсу IClientChannel для открытия, закрытия или прекращения работы канала. Чтобы упростить работу, средство Svcutil.exe также создает вспомогательный интерфейс, реализующий интерфейс контракта службы и IClientChannel позволяющий взаимодействовать с инфраструктурой клиентского канала без необходимости приведения. В следующем коде показано определение вспомогательного клиентского канала, реализующего предыдущий контракт службы.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}
Создание объекта клиентского канала WCF
Чтобы использовать клиентский канал для подключения к ISampleService
службе, используйте созданный интерфейс контракта (или его вспомогательную версию) непосредственно с фабрикой каналов, передав тип интерфейса контракта в качестве параметра типа. После того как фабрика каналов для определенного контракта создана и настроена, можно вызвать метод ChannelFactory<TChannel>.CreateChannel, чтобы вернуть объекты клиентского канала, которые можно использовать для взаимодействия со службой ISampleService
.
При создании объекты клиентского канала реализуют IClientChannel и интерфейс контракта. Поэтому их можно использовать непосредственно для вызова операций, взаимодействующих с службой, поддерживающей этот контракт.
Разница между использованием клиентских объектов и объектов канала клиента является лишь одним из элементов управления и простоты использования для разработчиков. Многие разработчики, которые комфортно работают с классами и объектами, предпочитают использовать клиентский объект WCF вместо клиентского канала WCF.
Пример см. в разделе "Практическое руководство. Использование ChannelFactory".