Dela via


Förstå genererad klientkod

Verktyget servicemodelmetadata (Svcutil.exe) genererar klientkod och en konfigurationsfil för klientprogram som används för att skapa klientprogram. Det här avsnittet innehåller en genomgång av genererade kodexempel för scenarier med standardtjänstkontrakt. Mer information om hur du skapar ett klientprogram med den genererade koden finns i Översikt över WCF-klient.

Översikt

Om du använder Visual Studio för att generera WCF-klienttyper (Windows Communication Foundation) för projektet behöver du vanligtvis inte undersöka den genererade klientkoden. Om du inte använder en utvecklingsmiljö som utför samma tjänster åt dig kan du använda ett verktyg som Svcutil.exe för att generera klientkod och sedan använda koden för att utveckla klientprogrammet.

Eftersom Svcutil.exe har ett antal alternativ som ändrar den genererade typinformationen diskuteras inte alla scenarier i det här avsnittet. Följande standarduppgifter omfattar dock att hitta genererad kod:

  • Identifiera tjänstkontraktsgränssnitt.

  • Identifiera WCF-klientklassen.

  • Identifiera datatyper.

  • Identifiera återanropskontrakt för duplex-tjänster.

  • Identifiera gränssnittet för hjälptjänstens kontraktkanal.

Hitta tjänstkontraktsgränssnitt

Om du vill hitta de gränssnitt som modellerar tjänstkontrakt söker du efter gränssnitt som har markerats med System.ServiceModel.ServiceContractAttribute attributet . Ofta kan det här attributet vara svårt att hitta med en snabbläsning på grund av förekomsten av andra attribut och de explicita egenskaper som angetts för själva attributet. Kom ihåg att tjänstkontraktsgränssnittet och klientkontraktsgränssnittet är två olika typer. I följande kodexempel visas det ursprungliga tjänstkontraktet.

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

I följande kodexempel visas samma tjänstkontrakt som genererades av 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);
}

Du kan använda det genererade tjänstkontraktsgränssnittet tillsammans med System.ServiceModel.ChannelFactory klassen för att skapa ett WCF-kanalobjekt som du kan anropa tjänståtgärder med. Mer information finns i Så här använder du ChannelFactory.

Hitta WCF-klientklasser

Om du vill hitta den WCF-klientklass som implementerar det tjänstkontrakt som du vill använda söker du efter ett tillägg av System.ServiceModel.ClientBase<TChannel>, där typparametern är det tjänstkontraktsgränssnitt som du tidigare har hittat och som utökar gränssnittet. I följande kodexempel visas ClientBase<TChannel> klassen av typen 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);
    }
}

Du kan använda den här WCF-klientklassen genom att skapa en ny instans av den och anropa de metoder som den implementerar. Dessa metoder anropar den tjänståtgärd som den har utformats och konfigurerats för att interagera med. Mer information finns i Översikt över WCF-klient.

Kommentar

När SvcUtil.exe genererar en WCF-klientklass läggs en DebuggerStepThroughAttribute till i klientklassen som förhindrar felsökningsprogram från att gå igenom WCF-klientklassen.

Hitta datatyper

För att hitta datatyper i den genererade koden är den mest grundläggande mekanismen att identifiera typnamnet som anges i ett kontrakt och söka efter den typdeklarationen i koden. Följande kontrakt anger till exempel att SampleMethod kan returnera ett SOAP-fel av typen 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 Sökningen efter letar upp följande typdeklaration.

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

I det här fallet är datatypen den detaljtyp som genereras av ett specifikt undantag på klienten, en FaultException<TDetail> där parametern för detaljtypen är microsoft.wcf.documentation.SampleFault. Mer information om datatyper finns i Ange dataöverföring i tjänstkontrakt. Mer information om hur du hanterar undantag i klienter finns i Skicka och ta emot fel.

Hitta återanropskontrakt för Duplex-tjänster

Om du hittar ett tjänstkontrakt för vilket kontraktsgränssnittet anger ett värde för ServiceContractAttribute.CallbackContract egenskapen anger kontraktet ett duplexkontrakt. Duplex-kontrakt kräver att klientprogrammet skapar en motringningsklass som implementerar återanropskontraktet och skickar en instans av den klassen till System.ServiceModel.DuplexClientBase<TChannel> eller System.ServiceModel.DuplexChannelFactory<TChannel> används för att kommunicera med tjänsten. Mer information om duplex-klienter finns i How to: Access Services with a Duplex Contract (Få åtkomst till tjänster med ett Duplex-kontrakt).

Följande kontrakt anger ett återanropskontrakt av typen 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

När du söker efter återanropskontraktet hittar du följande gränssnitt som klientprogrammet måste implementera.

  [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

Hitta servicekontraktskanalgränssnitt

När du använder ChannelFactory klassen med ett tjänstkontraktsgränssnitt måste du skicka till System.ServiceModel.IClientChannel gränssnittet för att uttryckligen öppna, stänga eller avbryta kanalen. För att göra det enklare att arbeta med genererar verktyget Svcutil.exe också ett hjälpgränssnitt som implementerar både tjänstkontraktsgränssnittet och IClientChannel gör det möjligt att interagera med klientkanalinfrastrukturen utan att behöva casta. Följande kod visar definitionen av en hjälpklientkanal som implementerar det föregående tjänstkontraktet.

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

Se även