Udostępnij za pośrednictwem


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.

Omówienie

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 modyfikujących 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 kontraktu usługi pomocnika.

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 , gdzie parametr typu jest interfejsem kontraktu System.ServiceModel.ClientBase<TChannel>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ą operację usługi, z którą została zaprojektowana i skonfigurowana do interakcji. Aby uzyskać więcej informacji, zobacz Omówienie klienta programu WCF.

Uwaga

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 PROTOKOŁU 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 takim przypadku typ danych to typ szczegółów zgłaszany przez określony wyjątek na kliencie, gdzie FaultException<TDetail> parametr typu szczegółów to microsoft.wcf.documentation.SampleFault. 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 wywołania zwrotnego dla usług dwuduplekowych

W przypadku zlokalizowania kontraktu usługi, dla którego interfejs kontraktu określa wartość właściwości ServiceContractAttribute.CallbackContract , kontrakt ten określa kontrakt dwudupleksowy. Kontrakty dwustronne wymagają aplikacji klienckiej utworzenia klasy wywołania zwrotnego, która implementuje kontrakt wywołania zwrotnego i przekazuje wystąpienie tej klasy do klasy lub System.ServiceModel.DuplexChannelFactory<TChannel> używanej do System.ServiceModel.DuplexClientBase<TChannel> komunikacji z usługą. Aby uzyskać więcej informacji na temat klientów dwukierunkowych, zobacz Instrukcje: Usługi programu Access z umową dwukierunkową.

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

W przypadku korzystania z ChannelFactory klasy z interfejsem kontraktu usługi należy rzutować go do interfejsu System.ServiceModel.IClientChannel , aby jawnie 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 też