Accesso ai servizi tramite 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 di norma i metadati di un servizio per generare il codice client WCF che può essere usato per richiamare il servizio.

I passaggi di base per la creazione di un client WCF includono i seguenti:

  1. Compilare il codice del servizio.

  2. Generare il proxy client WCF.

  3. Creare un'istanza del proxy client WCF.

Il proxy client di WCF può essere generato manualmente tramite lo strumento Service Model Metadata Utility (SvcUtil.exe). Per altre informazioni, vedere lo strumento ServiceModel Metadata Utility (Svcutil.exe). Il proxy client WCF può essere generato anche in Visual Studio usando la funzionalità Aggiungi riferimento al servizio. Per generare il proxy client WCF usando l'uno o l'altro metodo, è 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 effettuare nessun'altra operazione.

Strumento ServiceModel Metadata Utility Tool

ServiceModel Metadata Utility (Svcutil.exe) è uno strumento da riga di comando per generare codice dai metadati. Di seguito è riportato un esempio di utilizzo di un comando Svcutil.exe di base.

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

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

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

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

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

Svcutil.exe <file1 [,file2]>

Se viene fornito un solo nome file, si tratta del nome del file di output. Se vengono forniti due nomi file, il primo indica un file di configurazione di input il cui contenuto viene unito con la configurazione generata e scritto nel secondo file. Per altre informazioni sulla configurazione, vedere Configurazione dei binding per i servizi.

Importante

Le richieste di metadati non protette generano rischi esattamente come qualsiasi richiesta di rete non protetta. Se non si è certi dell'identità dell'endpoint con cui si sta comunicando, le informazioni recuperate potrebbero essere metadati provenienti da un servizio dannoso.

Aggiungi riferimento al 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 viene visualizzato un elenco dei servizi disponibili all'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 ServiceModel Metadata Utility e la funzionalità Aggiungi riferimento al servizio in Visual Studio generano la seguente classe client di WCF. La classe eredita dalla classe generica ClientBase<TChannel> e implementa l'interfaccia ICalculator. Lo strumento genera anche l'interfaccia ICalculator (procedure non illustrata di seguito).

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

Utilizzo del client WCF

Per usare il client WCF, creare un'istanza del client WCF e quindi chiamarne i 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 delle eccezioni generate da un client

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

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

  • CommunicationException: connessione sottostante chiusa in modo imprevisto.

  • CommunicationObjectAbortedException: connessione socket interrotta. Questo problema può essere causato da un errore durante l'elaborazione del messaggio, da un timeout di ricezione superato dall'host remoto o da un problema della risorsa di rete sottostante.

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

Vedi anche