Principy generovaného klientského kódu

Nástroj ServiceModel Metadata Utility (Svcutil.exe) generuje kód klienta a konfigurační soubor klientské aplikace pro použití při vytváření klientských aplikací. Toto téma obsahuje prohlídku vygenerovaných příkladů kódu pro standardní scénáře kontraktů služeb. Další informace o vytvoření klientské aplikace pomocí vygenerovaného kódu naleznete v tématu Přehled klienta WCF.

Přehled

Pokud pro svůj projekt vygenerujete typy klientů WCF (Windows Communication Foundation), obvykle nemusíte zkoumat vygenerovaný kód klienta. Pokud nepoužíváte vývojové prostředí, které pro vás provádí stejné služby, můžete použít nástroj, jako je Svcutil.exe, k vygenerování klientského kódu a následnému použití tohoto kódu k vývoji klientské aplikace.

Vzhledem k tomu, že Svcutil.exe obsahuje řadu možností, které upravují vygenerované informace o typu, toto téma nediskutuje všechny scénáře. Následující standardní úlohy však zahrnují vyhledání vygenerovaného kódu:

  • Identifikace rozhraní kontraktů služeb

  • Identifikace klientské třídy WCF

  • Identifikace datových typů

  • Identifikace kontraktů zpětného volání pro duplexní služby

  • Identifikace pomocného rozhraní kanálu kontraktu služeb

Hledání rozhraní kontraktů služeb

Pokud chcete vyhledat rozhraní, která modelují kontrakty služeb, vyhledejte rozhraní označená atributem System.ServiceModel.ServiceContractAttribute . Často může být tento atribut obtížné najít s rychlým čtením z důvodu přítomnosti jiných atributů a explicitních vlastností nastavených na samotný atribut. Mějte na paměti, že rozhraní kontraktů služeb a rozhraní klientského kontraktu jsou dva různé typy. Následující příklad kódu ukazuje původní kontrakt služby.

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

Následující příklad kódu ukazuje stejný kontrakt služby jako vygenerovaný 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);
}

Pomocí vygenerovaného rozhraní kontraktu služby spolu s System.ServiceModel.ChannelFactory třídou můžete vytvořit objekt kanálu WCF, se kterým lze vyvolat operace služby. Další informace naleznete v tématu Postupy: Použití ChannelFactory.

Vyhledání klientských tříd WCF

Chcete-li vyhledat klientskou třídu WCF, která implementuje kontrakt služby, který chcete použít, vyhledejte rozšíření System.ServiceModel.ClientBase<TChannel>, kde typ parametr je rozhraní kontraktu služby, které jste dříve našli a které rozšiřuje toto rozhraní. Následující příklad kódu ukazuje ClientBase<TChannel> třídu 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);
    }
}

Tuto třídu klienta WCF můžete použít tak, že vytvoříte novou instanci a zavoláte metody, které implementuje. Tyto metody vyvolávají operaci služby, se kterou je navržena a nakonfigurována pro interakci. Další informace naleznete v tématu Přehled klienta WCF.

Poznámka:

Když SvcUtil.exe vygeneruje klientskou třídu WCF, přidá DebuggerStepThroughAttribute do klientské třídy třídu, která brání ladicím programům krokovat přes třídu klienta WCF.

Hledání datových typů

Pro vyhledání datových typů ve vygenerovaném kódu je nejzásadnějším mechanismem identifikace názvu typu zadaného ve smlouvě a vyhledání kódu pro deklaraci tohoto typu. Například následující kontrakt určuje, že SampleMethod může vrátit chybu 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);

Hledání vyhledá SampleFault následující deklaraci 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;
            }
        }
    }
}

V tomto případě datový typ je typ podrobností vyvolaný konkrétní výjimkou klienta, FaultException<TDetail> kde je microsoft.wcf.documentation.SampleFaultparametr typu podrobností . Další informace o datových typech naleznete v tématu Určení přenosu dat v kontraktech služeb. Další informace o zpracování výjimek v klientech naleznete v tématu Odesílání a příjem chyb.

Vyhledání kontraktů zpětného volání pro duplexní služby

Pokud vyhledáte servisní kontrakt, pro který rozhraní kontraktu určuje hodnotu vlastnosti ServiceContractAttribute.CallbackContract , pak tato smlouva určuje duplexní kontrakt. Duplexní kontrakty vyžadují, aby klientská aplikace vytvořila třídu zpětného volání, která implementuje kontrakt zpětného volání a předává instanci této třídy do System.ServiceModel.DuplexClientBase<TChannel> služby nebo System.ServiceModel.DuplexChannelFactory<TChannel> používá ke komunikaci se službou. Další informace o duplexní klienty naleznete v tématu Postupy: Přístup ke službám pomocí duplexního kontraktu.

Následující smlouva určuje kontrakt zpětného volání 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

Hledání tohoto kontraktu zpětného volání vyhledá následující rozhraní, které musí klientská aplikace implementovat.

  [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

Hledání rozhraní kanálu kontraktů služeb

Při použití ChannelFactory třídy s rozhraním kontraktu služby je nutné přetypovat do System.ServiceModel.IClientChannel rozhraní explicitně otevřít, zavřít nebo přerušit kanál. Aby se s ním snadněji pracovalo, nástroj Svcutil.exe také generuje pomocné rozhraní, které implementuje rozhraní kontraktů služeb a IClientChannel umožňuje interakci s infrastrukturou kanálu klienta, aniž by bylo nutné přetypovat. Následující kód ukazuje definici pomocného klientského kanálu, který implementuje předchozí kontrakt služby.

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

Viz také