Udostępnij za pomocą


Opis wygenerowanego kodu klienta

Narzędzie ServiceModel Metadata Tool (Svcutil.exe) generuje kod klienta i plik konfiguracji aplikacji klienckiej do użycia w tworzeniu aplikacji klienckich. Ten temat zawiera przewodnik po wygenerowanych przykładach kodu dla standardowych scenariuszy kontraktów usług. Aby uzyskać więcej informacji na temat tworzenia aplikacji klienckiej przy użyciu wygenerowanego kodu, zobacz Omówienie klienta WCF.

Przegląd

Jeśli używasz programu Visual Studio do generowania typów klientów programu Windows Communication Foundation (WCF) dla projektu, zazwyczaj nie trzeba badać wygenerowanego kodu klienta. Jeśli nie używasz środowiska programistycznego, które wykonuje te same usługi, możesz użyć narzędzia, takiego jak Svcutil.exe, aby wygenerować kod klienta, a następnie użyć tego kodu do tworzenia aplikacji klienckiej.

Ponieważ Svcutil.exe ma wiele opcji, które modyfikują wygenerowane informacje o typie, w tym temacie nie omówiono wszystkich scenariuszy. Jednak następujące standardowe zadania obejmują lokalizowanie wygenerowanego kodu:

  • Identyfikowanie interfejsów kontraktów usług.

  • Identyfikowanie klasy klienta WCF.

  • Identyfikowanie typów danych.

  • Identyfikowanie kontraktów wywołania zwrotnego dla usług dwukierunkowych.

  • Identyfikowanie interfejsu kanału umowy usługi pomocniczej.

Znajdowanie interfejsów kontraktów usług

Aby zlokalizować interfejsy modelujące kontrakty usług, wyszukaj interfejsy oznaczone atrybutem System.ServiceModel.ServiceContractAttribute . Często ten atrybut może być trudny do zlokalizowania z szybkim odczytem ze względu na obecność innych atrybutów i jawnych właściwości ustawionych na samym atrybucie. Pamiętaj, że interfejs kontraktu usługi i interfejs kontraktu klienta są dwoma różnymi typami. Poniższy przykład kodu przedstawia oryginalny kontrakt usługi.

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

Poniższy przykład kodu przedstawia ten sam kontrakt usługi, który został wygenerowany przez 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);
}

Możesz użyć wygenerowanego interfejsu kontraktu usługi wraz z System.ServiceModel.ChannelFactory klasą, aby utworzyć obiekt kanału WCF, z którym mają być wywoływane operacje usługi. Aby uzyskać więcej informacji, zobacz How to: Use the ChannelFactory (Instrukcje: korzystanie z metody ChannelFactory).

Znajdowanie klas klientów programu WCF

Aby zlokalizować klasę klienta WCF, która implementuje kontrakt usługi, którego chcesz użyć, wyszukaj rozszerzenie System.ServiceModel.ClientBase<TChannel>, gdzie parametr typu jest interfejsem kontraktu usługi, który został wcześniej zlokalizowany i który rozszerza ten interfejs. Poniższy przykład kodu przedstawia klasę ClientBase<TChannel> typu 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);
    }
}

Możesz użyć tej klasy klienta WCF, tworząc nowe wystąpienie i wywołując metody, które implementuje. Metody te wywołują operacje usług, z którymi zostały zaprojektowane i skonfigurowane do interakcji. Aby uzyskać więcej informacji, zobacz Omówienie klienta programu WCF.

Uwaga / Notatka

Gdy SvcUtil.exe generuje klasę klienta WCF, dodaje element DebuggerStepThroughAttribute do klasy klienta, który uniemożliwia debugerom przechodzenie przez klasę klienta WCF.

Znajdowanie typów danych

Aby zlokalizować typy danych w wygenerowanym kodzie, najbardziej podstawowym mechanizmem jest zidentyfikowanie nazwy typu określonej w umowie i wyszukanie kodu dla tej deklaracji typu. Na przykład, poniższy kontrakt określa, że SampleMethod może zwrócić błąd SOAP typu 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 Wyszukiwanie lokalizuje następującą deklarację typu.

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

W tym przypadku typem danych jest typ szczegółów wyrzucany przez określony wyjątek na kliencie, gdzie parametrem typu szczegółów jest FaultException<TDetail>. Aby uzyskać więcej informacji na temat typów danych, zobacz Określanie transferu danych w kontraktach usług. Aby uzyskać więcej informacji na temat obsługi wyjątków na klientach, zobacz Wysyłanie i odbieranie błędów.

Znajdowanie kontraktów dla usług dupleksowych

W przypadku zlokalizowania kontraktu usługi, dla którego interfejs kontraktu określa wartość właściwości ServiceContractAttribute.CallbackContract, kontrakt ten jest kontraktem dwukierunkowym. Kontrakty dwustronne wymagają od aplikacji klienckiej utworzenia klasy implementującej kontrakt wywołania zwrotnego oraz przekazania wystąpienia tej klasy do System.ServiceModel.DuplexClientBase<TChannel> lub System.ServiceModel.DuplexChannelFactory<TChannel> używanego do komunikacji z usługą. Aby uzyskać więcej informacji na temat klientów dwustronnych, zobacz How to: Access Services with a Duplex Contract (Instrukcje: uzyskiwanie dostępu do usług za pomocą kontraktu dwustronnego).

Poniższy kontrakt określa kontrakt wywołania zwrotnego typu 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

Wyszukiwanie tego kontraktu wywołania zwrotnego lokalizuje następujący interfejs, który musi zaimplementować aplikacja kliencka.

  [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

Znajdowanie interfejsów kanału kontraktu usługi

Podczas korzystania z klasy ChannelFactory z interfejsem kontraktu serwisowego, należy dokonać rzutowania na interfejs System.ServiceModel.IClientChannel, aby wyraźnie otworzyć, zamknąć lub przerwać kanał. Aby ułatwić pracę, narzędzie Svcutil.exe generuje również interfejs pomocnika, który implementuje zarówno interfejs kontraktu usługi, jak i IClientChannel umożliwia interakcję z infrastrukturą kanału klienta bez konieczności rzutowania. Poniższy kod przedstawia definicję kanału klienta pomocnika, który implementuje poprzedni kontrakt usługi.

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

Zobacz także