Condividi tramite


Informazioni sul codice client generato

Lo strumento utilità metadati ServiceModel (Svcutil.exe) genera codice client e un file di configurazione dell'applicazione client da usare per la compilazione di applicazioni client. In questo argomento viene fornita una panoramica degli esempi di codice generati per gli scenari del contratto di servizio standard. Per altre informazioni sulla compilazione di un'applicazione client usando il codice generato, vedere Cenni preliminari sul client WCF.

Informazioni generali

Se si usa Visual Studio per generare tipi di client Windows Communication Foundation (WCF) per il progetto, in genere non è necessario esaminare il codice client generato. Se non si usa un ambiente di sviluppo che esegue gli stessi servizi, è possibile usare uno strumento come Svcutil.exe per generare codice client e quindi usare tale codice per sviluppare l'applicazione client.

Poiché Svcutil.exe include diverse opzioni che modificano le informazioni sul tipo generato, questo argomento non illustra tutti gli scenari. Tuttavia, le attività standard seguenti comportano l'individuazione del codice generato:

  • Identificazione delle interfacce del contratto di servizio.

  • Identificazione della classe client WCF.

  • Identificazione dei tipi di dati.

  • Identificazione dei contratti di callback per i servizi duplex.

  • Identificazione dell'interfaccia del canale del contratto di servizio di supporto.

Ricerca delle interfacce del contratto di servizio

Per individuare le interfacce che modellano i contratti di servizio, cercare le interfacce contrassegnate con l'attributo System.ServiceModel.ServiceContractAttribute . Spesso questo attributo può essere difficile da individuare con una lettura rapida a causa della presenza di altri attributi e delle proprietà esplicite impostate sull'attributo stesso. Tenere presente che l'interfaccia del contratto di servizio e l'interfaccia del contratto client sono due tipi diversi. Nell'esempio di codice seguente viene illustrato il contratto di servizio originale.

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

Nell'esempio di codice seguente viene illustrato lo stesso contratto di servizio generato da 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);
}

È possibile utilizzare l'interfaccia del contratto di servizio generata insieme alla System.ServiceModel.ChannelFactory classe per creare un oggetto canale WCF con cui richiamare le operazioni del servizio. Per altre informazioni, vedere Procedura: Usare ChannelFactory.

Ricerca di classi client WCF

Per individuare la classe client WCF che implementa il contratto di servizio da usare, cercare un'estensione di , dove il parametro di System.ServiceModel.ClientBase<TChannel>tipo è l'interfaccia del contratto di servizio individuata in precedenza e che estende tale interfaccia. Nell'esempio di codice seguente viene illustrata la ClientBase<TChannel> classe di tipo 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);
    }
}

È possibile usare questa classe client WCF creando una nuova istanza di esso e chiamando i metodi implementati. Questi metodi richiamano l'operazione del servizio con cui è progettata e configurata per interagire. Per altre informazioni, vedere Cenni preliminari sul client WCF.

Annotazioni

Quando SvcUtil.exe genera una classe client WCF, aggiunge un DebuggerStepThroughAttribute oggetto alla classe client che impedisce ai debugger di scorrere la classe client WCF.

Ricerca di tipi di dati

Per individuare i tipi di dati nel codice generato, il meccanismo più semplice consiste nell'identificare il nome del tipo specificato in un contratto e cercare nel codice la dichiarazione di quel tipo. Ad esempio, il contratto seguente specifica che SampleMethod può restituire un errore SOAP di tipo 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 La ricerca individua la dichiarazione di tipo seguente.

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

In questo caso il tipo di dati è il tipo di dettaglio generato da un'eccezione specifica nel client, dove FaultException<TDetail> il parametro del tipo di dettaglio è microsoft.wcf.documentation.SampleFault. Per altre informazioni sui tipi di dati, vedere Specifica del trasferimento dei dati nei contratti di servizio. Per altre informazioni sulla gestione delle eccezioni nei client, vedere Invio e ricezione di errori.

Ricerca dei contratti di callback per i servizi duplex

Se si individua un contratto di servizio per il quale l'interfaccia del contratto specifica un valore per la ServiceContractAttribute.CallbackContract proprietà, tale contratto specifica un contratto duplex. I contratti duplex richiedono all'applicazione client di creare una classe di callback che implementa il contratto di callback e passare un'istanza di tale classe all'oggetto System.ServiceModel.DuplexClientBase<TChannel> o System.ServiceModel.DuplexChannelFactory<TChannel> usata per comunicare con il servizio. Per altre informazioni sui client duplex, vedere Procedura: Accedere ai servizi con un contratto duplex.

Il contratto seguente specifica un contratto di callback di tipo 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

La ricerca di tale contratto di callback individua l'interfaccia seguente che l'applicazione client deve implementare.

  [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

Ricerca delle interfacce del canale di contratto di servizio

Quando si usa la ChannelFactory classe con un'interfaccia del contratto di servizio, è necessario eseguire il cast all'interfaccia System.ServiceModel.IClientChannel per aprire, chiudere o interrompere in modo esplicito il canale. Per semplificare il funzionamento, lo strumento Svcutil.exe genera anche un'interfaccia helper che implementa sia l'interfaccia IClientChannel del contratto di servizio che per consentire l'interazione con l'infrastruttura del canale client senza dover eseguire il cast. Il codice seguente illustra la definizione di un canale client helper che implementa il contratto di servizio precedente.

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

Vedere anche