Поделиться через


Основные сведения о созданном коде клиента

Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) создает код клиента и конфигурационный файл клиентского приложения для использования при построении клиентских приложений. В этом разделе показаны примеры созданного кода для стандартных сценариев контрактов службы. Дополнительные сведения построении клиентского приложения с помощью созданного кода см. в разделе Общие сведения о клиентах WCF.

Общие сведения

При использовании Visual Studio для создания типов клиентов Windows Communication Foundation (WCF) для проекта проверки созданного кода клиента обычно не требуется. Если используемая среда разработки не выполняет аналогичные службы, для создания кода клиента, а также для последующего использования этого кода для разработки клиентского приложения можно использовать такое средство, как Svcutil.exe.

Поскольку Svcutil.exe имеет несколько параметров, способных изменить тип созданной информации, данный раздел не рассматривает все сценарии. Тем не менее, поиск созданного кода включен в следующие задачи:

  • Определение интерфейсов контрактов служб.

  • Определение класса клиента WCF.

  • Определение типа данных.

  • Определение контрактов обратного вызова для дуплексных служб.

  • Определение интерфейса канала контракта службы поддержки.

Поиск интерфейсов контрактов служб

Чтобы найти интерфейсы, которые моделируют контракты служб, необходимо искать интерфейсы, отмеченные атрибутом System.ServiceModel.ServiceContractAttribute. Зачастую этот атрибут сложно найти при быстром прочтении из-за наличия других атрибутов и явных свойств, установленных на сам атрибут. Не следует забывать, что интерфейс контракта службы и интерфейс контракта клиента — это разные типы интерфейса. В следующем примере кода показан исходный контракт службы.

[ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
  [OperationContractAttribute]
  [FaultContractAttribute(typeof(microsoft.wcf.documentation.SampleFault))]
  string SampleMethod(string msg);
}

В следующем примере кода показан тот же контракт службы, созданный Svcutil.exe.

[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.ServiceModel.ChannelFactory для создания объекта канала WCF, с помощью которого вызываются операции службы. Дополнительные сведения см. в разделе Как использовать ChannelFactory.

Поиск классов клиента WCF

Чтобы найти класс клиента WCF, реализующий необходимый контракт службы, следует искать расширение класса System.ServiceModel.ClientBase, параметром типа в котором является интерфейс контракта службы, который был только что найден и который расширяет этот интерфейс. Следующий пример кода иллюстрирует класс ClientBase типа ISampleService.

[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);
    }
}

Класс клиента WCF можно использовать путем создания его нового экземпляра и вызова методов его реализации. Эти методы вызывают операцию службы, для взаимодействия с которой они разработаны и сконфигурированы. Дополнительные сведения см. в разделе Общие сведения о клиентах WCF.

ms733881.note(ru-ru,VS.100).gifПримечание
При создании средством SvcUtil.exe класса клиента WCF к классу клиента добавляется DebuggerStepThroughAttribute для предотвращения пошагового перебора элементов класса клиента WCF отладчиками.

Поиск типа данных

Основным способом поиска данных в созданном коде является идентификация имени типа, заданного в контракте, и поиск в коде объявления этого типа. Например, следующий контракт задает, что метод SampleMethod может возвращать ошибку SOAP типа microsoft.wcf.documentation.SampleFault.

[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);

Поиск SampleFault определяет местонахождение следующего объявления типа.

[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;
            }
        }
    }
}

В этом случае тип данных представляет собой тип сведений, вызванный конкретным исключением со стороны клиента, FaultException, где параметром типа сведений является microsoft.wcf.documentation.SampleFault. Дополнительные сведения типах данных см. раздел Задание передачи данных в контрактах служб. Дополнительные сведения обработке исключений в приложениях клиента см. в разделе Сбои при отправке и получении.

Поиск контрактов обратного вызова для дуплексных служб

Если определяется местоположение контракта службы, для которого интерфейс контракта задает значение свойства System.ServiceModel.ServiceContractAttribute.CallbackContract, то этот контракт задает дуплексный контракт. Дуплексные контракты требуют, чтобы клиентское приложение создавало класс обратного вызова, реализующий контракт обратного вызова и передавало экземпляр этого класса System.ServiceModel.DuplexClientBase или System.ServiceModel.DuplexChannelFactory, использующихся для общения со службой. Дополнительные сведения о дуплексных клиентах см. в разделе Практическое руководство. Доступ к службам с дуплексным контрактом.

Следующий контракт задает контракт обратного вызова типа SampleDuplexHelloCallback.

    <System.ServiceModel.OperationContractAttribute(IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Hello")> _
    Sub Hello(ByVal greeting As String)
End Interface 'SampleDuplexHello
[System.ServiceModel.ServiceContractAttribute(
  Namespace="http://microsoft.wcf.documentation", 
  ConfigurationName="SampleDuplexHello", 
  CallbackContract=typeof(SampleDuplexHelloCallback), 
  SessionMode=System.ServiceModel.SessionMode.Required
)]
public interface SampleDuplexHello
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true, 
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Hello"
    )]
    void Hello(string greeting);
  }

Поиск этого контракта обратного вызова определяет местоположение следующего интерфейса, который должен быть реализован в клиентском приложении.

<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Public Interface SampleDuplexHelloCallback
    <System.ServiceModel.OperationContractAttribute( _
        IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Reply")> _
    Sub Reply(ByVal responseToGreeting As String)
End Interface 'SampleDuplexHelloCallback
  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface SampleDuplexHelloCallback
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true, 
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Reply"
    )]
    void Reply(string responseToGreeting);
  }

Поиск интерфейсов каналов контрактов служб

При использовании класса ChannelFactory с интерфейсом контракта службы следует перейти к интерфейсу System.ServiceModel.IClientChannel, чтобы явно открыть, закрыть канал или прервать его работу. Для упрощения работы средство Svcutil.exe создает также вспомогательный интерфейс, реализующий и интерфейс контракта службы, и интерфейс IClientChannel, чтобы можно было взаимодействовать с инфраструктурой клиентских каналов без переходов. В следующем коде показано определение вспомогательного клиентского канала, который реализует указанный выше контракт службы.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

См. также

Основные понятия

Общие сведения о клиентах WCF