Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Часто один и тот же человек не разрабатывает и реализует службы. В средах, где важно взаимодействие приложений, контракты можно разрабатывать или описывать в языке описания веб-служб (WSDL), а разработчик должен реализовать службу, соответствующую предоставленному контракту. Вы также можете перенести существующую службу в Windows Communication Foundation (WCF), но сохранить формат провода. Кроме того, дуплексные контракты требуют, чтобы вызывающие также реализовали контракт обратного вызова.
В этих случаях необходимо использовать средство служебной программы ServiceModel Metadata Tool (Svcutil.exe) (или эквивалентное средство) для создания интерфейса контракта службы на управляемом языке, который можно реализовать для выполнения требований контракта. Обычно служебная программа метаданных ServiceModel (Svcutil.exe) используется для получения контракта службы, используемого с фабрикой каналов или типом клиента WCF, а также с файлом конфигурации клиента, который настраивает правильную привязку и адрес. Чтобы использовать созданный файл конфигурации, необходимо изменить его в файл конфигурации службы. Кроме того, может потребоваться изменить контракт службы.
Получение данных и реализация соответствующей службы
Используйте средство служебной программы метаданных ServiceModel (Svcutil.exe) для файлов метаданных или конечной точки метаданных для создания файла кода.
Найдите часть файла выходного кода, содержащего интересующий интерфейс (в случае, если имеется несколько), помеченный атрибутом System.ServiceModel.ServiceContractAttribute. В следующем примере кода показаны два интерфейса, созданные ServiceModel Metadata Utility Tool (Svcutil.exe). Первый (
ISampleService
) — это интерфейс контракта службы, который вы реализуете для создания соответствующей службы. Второй (ISampleServiceChannel
) — это вспомогательный интерфейс для использования клиента, который расширяет интерфейс контракта службы и System.ServiceModel.IClientChannel и предназначен для использования в клиентском приложении.[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [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); } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel { }
Если WSDL не указывает действие ответа для всех операций, созданные контракты операций могут иметь свойство ReplyAction, установленное в подстановочный знак (*). Удалите этот параметр свойства. В противном случае при реализации метаданных контракта службы метаданные нельзя экспортировать для этих операций.
Реализуйте интерфейс в классе и размещайте службу. Пример см. в статье "Практическое руководство по реализации контракта сервиса"или же в разделе "Пример" ниже.
В файле конфигурации клиента, создаваемом утилитой метаданных ServiceModel (Svcutil.exe), измените клиентский раздел конфигурации <> на раздел конфигурации служб <>. (Пример файла конфигурации созданного клиентского приложения см. в следующем разделе "Пример".
В разделе конфигурации служб <> создайте атрибут
name
в разделе конфигурации служб <> для реализации службы.Задайте атрибуту службы
name
имя конфигурации для реализации вашей службы.Добавьте элементы конфигурации конечной точки, использующие реализованный контракт службы, в раздел конфигурации службы.
Пример
В следующем примере кода показана большая часть файла кода, полученного в результате выполнения средства метаданных ServiceModel (Svcutil.exe) по файлам метаданных.
Следующий код показывает:
Интерфейс контракта службы, который при реализации соответствует требованиям контракта (
ISampleService
).Вспомогательный интерфейс для использования клиентом, который расширяет интерфейс контракта службы и System.ServiceModel.IClientChannel, предназначен для использования в клиентском приложении (
ISampleServiceChannel
).Вспомогательный класс, расширяющий System.ServiceModel.ClientBase<TChannel> и используемый в клиентском приложении (
SampleServiceClient
).Файл конфигурации, созданный службой.
Простая реализация службы
ISampleService
.Преобразование файла конфигурации на стороне клиента в версию на стороне службы.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.42
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
[assembly: System.Runtime.Serialization.ContractNamespaceAttribute("http://microsoft.wcf.documentation", ClrNamespace="microsoft.wcf.documentation")]
namespace microsoft.wcf.documentation
{
using System.Runtime.Serialization;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class SampleFault : object, System.Runtime.Serialization.IExtensibleDataObject
{
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
private string FaultMessageField;
public System.Runtime.Serialization.ExtensionDataObject ExtensionData
{
get
{
return this.extensionDataField;
}
set
{
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string FaultMessage
{
get
{
return this.FaultMessageField;
}
set
{
this.FaultMessageField = value;
}
}
}
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[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);
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class SampleServiceClient : System.ServiceModel.ClientBase<ISampleService>, ISampleService
{
public SampleServiceClient()
{
}
public SampleServiceClient(string endpointConfigurationName) :
base(endpointConfigurationName)
{
}
public SampleServiceClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}
public SampleServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}
public SampleServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)
{
}
public string SampleMethod(string msg)
{
return base.Channel.SampleMethod(msg);
}
}
<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="http://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="ISampleService"
name="BasicHttpBinding_ISampleService" />
</client>
</system.serviceModel>
</configuration>
// Implement the service. This is a very simple service.
class SampleService : ISampleService
{
public string SampleMethod(string msg)
{
Console.WriteLine($"The caller said: \"{msg}\"");
return "The service greets you: " + msg;
}
}
<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="http://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="Microsoft.WCF.Documentation.ISampleService"
/>
</service>
</services>
</system.serviceModel>
</configuration>
См. также
- Утилита метаданных ServiceModel (Svcutil.exe)