Как извлечь метаданные и реализовать совместимую службу
Часто разработку и реализацию служб выполняют разные люди. В средах, в которых приложения с возможностью взаимодействия имеют большое значение, контракты можно разработать или описать на языке WSDL, и разработчик должен реализовать службу, соответствующую предоставляемому контракту. Также может возникнуть необходимость мигрировать существующую службу в Windows Communication Foundation (WCF) с сохранением формата подключения. Кроме того, дуплексные контракты требуют, чтобы вызывающие стороны также реализовывали контракт обратного вызова.
В этих случаях необходимо использовать средство Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) (или эквивалентное средство), чтобы создать интерфейс контракта службы на управляемом языке, который можно реализовать для выполнения требований контракта. Обычно средство Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) используется, чтобы получить контракт службы, используемый с фабрикой каналов, или тип клиента WCF, а также файл конфигурации клиента, который задает правильную привязку и адрес. Чтобы использовать созданный файл конфигурации, следует изменить его на файл конфигурации службы. Также может возникнуть необходимость в изменении контракта службы.
Извлечение данных и реализация совместимой службы
Используйте средство Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) для файлов метаданных или конечной точки метаданных, чтобы создать файл кода.
Найдите часть выходного файла кода, содержащую требуемый интерфейс (если имеется более одного), отмеченный атрибутом System.ServiceModel.ServiceContractAttribute. В следующем примере кода показаны два интерфейса, созданные с помощью средства Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe). Первый интерфейс (
ISampleService
) представляет собой интерфейс контракта службы, который реализуется, чтобы создать совместимую службу. Второй интерфейс (ISampleServiceChannel
) представляет собой вспомогательный интерфейс, используемый для клиентов и расширяющий как интерфейс контракта службы, так и канал System.ServiceModel.IClientChannel, и используется в клиентском приложении.Если в языке WSDL не указано ответное действие для всех операций, свойству ReplyAction созданных контрактов операций может быть присвоено значение подстановочного знака (*). Удалите этот параметр свойства. В противном случае при реализации метаданных контракта службы метаданные невозможно будет экспортировать для этих операций.
Реализуйте интерфейс для класса и разместите службу. Пример см. в разделе Как реализовать контракт службы Windows Communication Foundation или см. простую реализацию, представленную в разделе "Пример" ниже.
В файле конфигурации клиента, созданном с помощью средства Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe), измените раздел конфигурации <client> на раздел конфигурации <services>. (Пример созданного файла конфигурации клиентского приложения см. в следующем разделе "Пример".)
В разделе конфигурации <services> создайте атрибут name в разделе конфигурации <services> для реализации службы.
Присвойте атрибуту name службы имя конфигурации для реализации службы.
Добавьте элементы конфигурации конечной точки, использующие реализованный контракт службы, в раздел конфигурации службы.
Пример
В следующем примере кода показана большая часть файла кода, созданного при выполнении средства Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) для файлов метаданных.
В коде демонстрируется следующее.
Интерфейс контракта службы, который после реализации отвечает требованиям контракта (
ISampleService
).Вспомогательный интерфейс, используемый для клиентов и расширяющий как интерфейс контракта службы, так и канал System.ServiceModel.IClientChannel. Этот интерфейс используется в клиентском приложении (
ISampleServiceChannel
).Вспомогательный класс, расширяющий класс System.ServiceModel.ClientBase и используемый в клиентском приложении (
SampleServiceClient
).Файл конфигурации, созданный из службы.
Простая реализация службы
ISampleService
.Преобразование файла конфигурации на стороне клиента в версию на стороне службы.
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="ISampleService"
name="BasicHttpBinding_ISampleService" />
</client>
</system.serviceModel>
</configuration>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService">
<endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="Microsoft.WCF.Documentation.ISampleService"
/>
</service>
</services>
</system.serviceModel>
</configuration>
См. также
Основные понятия
Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe)