Condividi tramite


Accesso ai servizi tramite un client WCF

Dopo aver creato un servizio, il passaggio successivo consiste nel creare un proxy client WCF. Un'applicazione client usa il proxy client WCF per comunicare con il servizio. Le applicazioni client importano in genere i metadati di un servizio per generare codice client WCF che può essere usato per richiamare il servizio.

I passaggi di base per la creazione di un client WCF includono quanto segue:

  1. Compilare il codice del servizio.

  2. Generare il proxy client WCF.

  3. Istanziate il proxy client WCF.

Il proxy client WCF può essere generato manualmente tramite lo strumento Utilità metadati del modello di servizio (SvcUtil.exe) per altre informazioni, vedere ServiceModel Metadata Utility Tool (Svcutil.exe). Il proxy client WCF può anche essere generato in Visual Studio usando la funzionalità Aggiungi riferimento al servizio . Per generare il proxy client WCF utilizzando uno dei due metodi, è necessario che il servizio sia in esecuzione. Se il servizio è self-hosted, è necessario eseguire l'host. Se il servizio è ospitato in IIS/WAS, non è necessario eseguire altre operazioni.

Utilità per i metadati di ServiceModel

ServiceModel Metadata Utility Tool (Svcutil.exe) è uno strumento da riga di comando per generare codice dai metadati. L'uso seguente è un esempio di comando Svcutil.exe di base.

Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>

In alternativa, è possibile usare Svcutil.exe con i file WSDL (Web Services Description Language) e XML Schema Definition Language (XSD) nel file system.

Svcutil.exe <list of WSDL and XSD files on file system>

Il risultato è un file di codice che contiene codice client WCF che l'applicazione client può usare per richiamare il servizio.

È anche possibile usare lo strumento per generare file di configurazione.

Svcutil.exe <file1 [,file2]>

Se viene assegnato un solo nome di file, ovvero il nome del file di output. Se vengono assegnati due nomi di file, il primo file è un file di configurazione di input il cui contenuto viene unito alla configurazione generata e scritto nel secondo file. Per altre informazioni sulla configurazione, vedere Configurazione delle associazioni per i servizi.

Importante

Le richieste di metadati non protette comportano determinati rischi nello stesso modo in cui viene eseguita qualsiasi richiesta di rete non protetta: se non si è certi che l'endpoint con cui si sta comunicando sia quello indicato, le informazioni recuperate potrebbero essere metadati da un servizio dannoso.

Aggiungere informazioni di riferimento sul servizio in Visual Studio

Con il servizio in esecuzione, fare clic con il pulsante destro del mouse sul progetto che conterrà il proxy client WCF e selezionare Aggiungi>riferimento al servizio. Nella finestra di dialogo Aggiungi riferimento al servizio digitare l'URL del servizio che si desidera chiamare e fare clic sul pulsante Vai . Nella finestra di dialogo verrà visualizzato un elenco di servizi disponibili nell'indirizzo specificato. Fare doppio clic sul servizio per visualizzare i contratti e le operazioni disponibili, specificare uno spazio dei nomi per il codice generato e fare clic sul pulsante OK .

Esempio

Nell'esempio di codice seguente viene illustrato un contratto di servizio creato per un servizio.

// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    // Other methods are not shown here.
}
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
    <OperationContract()>  _
    Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
    ' Other methods are not shown here.
End Interface

Lo strumento di utilità metadati ServiceModel e Aggiungi riferimento al servizio in Visual Studio genera la classe client WCF seguente. La classe eredita dalla classe generica ClientBase<TChannel> e implementa l'interfaccia ICalculator . Lo strumento genera anche l'interfaccia ICalculator (non illustrata qui).

public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
    public CalculatorClient()
    {}

    public CalculatorClient(string endpointConfigurationName) :
            base(endpointConfigurationName)
    {}

    public CalculatorClient(string endpointConfigurationName, string remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
    {}

    public CalculatorClient(string endpointConfigurationName,
        System.ServiceModel.EndpointAddress remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
    {}

    public CalculatorClient(System.ServiceModel.Channels.Binding binding,
        System.ServiceModel.EndpointAddress remoteAddress) :
            base(binding, remoteAddress)
    {}

    public double Add(double n1, double n2)
    {
        return base.Channel.Add(n1, n2);
    }
}
Partial Public Class CalculatorClient
    Inherits System.ServiceModel.ClientBase(Of ICalculator)
    Implements ICalculator

    Public Sub New()
        MyBase.New
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String)
        MyBase.New(endpointConfigurationName)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(binding, remoteAddress)
    End Sub

    Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        Implements ICalculator.Add
        Return MyBase.Channel.Add(n1, n2)
    End Function
End Class

Uso del client WCF

Per usare il client WCF, creare un'istanza del client WCF e quindi chiamare i relativi metodi, come illustrato nel codice seguente.

// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint");
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
' Create a client object with the given client endpoint configuration.
Dim calcClient As CalculatorClient = _
New CalculatorClient("CalculatorEndpoint")

' Call the Add service operation.
Dim value1 As Double = 100.00D
Dim value2 As Double = 15.99D
Dim result As Double = calcClient.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)

Debug di eccezioni generate da un client

Molte eccezioni generate da un client WCF sono causate da un'eccezione nel servizio. Di seguito sono riportati alcuni esempi:

  • SocketException: una connessione esistente è stata chiusa forzatamente dall'host remoto.

  • CommunicationException: la connessione sottostante è stata chiusa in modo imprevisto.

  • CommunicationObjectAbortedException: la connessione socket è stata interrotta. Ciò potrebbe essere causato da un errore durante l'elaborazione del messaggio, da un timeout di ricezione superato dall'host remoto o da un problema di risorse di rete sottostante.

Quando si verificano questi tipi di eccezioni, il modo migliore per risolvere il problema consiste nell'attivare la traccia sul lato servizio e determinare l'eccezione che si è verificata. Per altre informazioni sulla traccia, vedere Traccia e uso della traccia per risolvere i problemi dell'applicazione.

Vedere anche