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


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

Средство служебной программы метаданных ServiceModel (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<TChannel>, где параметр типа — это интерфейс контракта службы, который вы ранее обнаружили и расширяет этот интерфейс. В следующем примере кода показан ClientBase<TChannel> класс типа 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.

Замечание

Во время генерации 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<TDetail>, где параметр детального типа — microsoft.wcf.documentation.SampleFault. Дополнительные сведения о типах данных см. в разделе "Указание передачи данных в контрактах служб". Дополнительные сведения об обработке исключений в клиентах см. в разделе "Отправка и получение ошибок".

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

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

Данный контракт специфицирует контракт обратного вызова типа SampleDuplexHelloCallback.

[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.ServiceModel.OperationContractAttribute(IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Hello")> _
    Sub Hello(ByVal greeting As String)
End Interface 'SampleDuplexHello

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

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

Поиск интерфейсов канала сервисного контракта

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

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

См. также