Condividi tramite


Esempio introduttivo

L'esempio GettingStarted illustra come implementare un servizio tipico e un client tipico usando Windows Communication Foundation (WCF). Questo esempio è la base per tutti gli altri esempi tecnologici di base.

Annotazioni

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.

Il servizio descrive le operazioni eseguite in un contratto di servizio esposto pubblicamente come metadati. Il servizio contiene anche il codice per implementare le operazioni.

Il client contiene una definizione del contratto di servizio e una classe proxy per l'accesso al servizio. Il codice proxy viene generato dai metadati del servizio usando lo strumento utilità metadati ServiceModel (Svcutil.exe).

In Windows Vista il servizio è ospitato nel servizio di attivazione di Windows (WAS). In Windows XP e Windows Server 2003 è ospitato da Internet Information Services (IIS) e ASP.NET. L'hosting di un servizio in IIS o WAS consente l'attivazione automatica del servizio quando si accede per la prima volta.

Annotazioni

Se si preferisce iniziare a usare un esempio che ospita il servizio in un'applicazione console invece di IIS, vedere l'esempio self-host .

Il servizio e il client specificano i dettagli di accesso nelle impostazioni del file di configurazione, che offrono flessibilità al momento della distribuzione. Ciò include una definizione di endpoint che specifica un indirizzo, un'associazione e un contratto. Il vincolo specifica i dettagli di trasporto e sicurezza per come accedere al servizio.

Il servizio configura un comportamento di runtime per pubblicare i metadati.

Il servizio implementa un contratto che definisce un modello di comunicazione request-reply. Il contratto è definito dall'interfaccia ICalculator , che espone operazioni matematiche (aggiunta, sottrazione, moltiplicazione e divisione). Il client invia richieste a una determinata operazione matematica e il servizio risponde con il risultato. Il servizio implementa un ICalculator contratto definito nel codice seguente.

' Define a service contract.
    <ServiceContract(Namespace:="http://Microsoft.Samples.GettingStarted")>
     Public Interface ICalculator
        <OperationContract()>
        Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()>
        Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()>
        Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()>
        Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
    End Interface
// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
}

L'implementazione del servizio calcola e restituisce il risultato appropriato, come illustrato nel codice di esempio seguente.

' Service class which implements the service contract.
Public Class CalculatorService
Implements ICalculator
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
Return n1 + n2
End Function

Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
Return n1 - n2
End Function

Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
Return n1 * n2
End Function

Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
Return n1 / n2
End Function
End Class
// Service class that implements the service contract.
public class CalculatorService : ICalculator
{
    public double Add(double n1, double n2)
    {
        return n1 + n2;
    }
    public double Subtract(double n1, double n2)
    {
        return n1 - n2;
    }
    public double Multiply(double n1, double n2)
    {
        return n1 * n2;
    }
    public double Divide(double n1, double n2)
    {
        return n1 / n2;
    }
}

Il servizio espone un endpoint per la comunicazione con il servizio, definito usando un file di configurazione (Web.config), come illustrato nella configurazione di esempio seguente.

<services>
    <service
        name="Microsoft.ServiceModel.Samples.CalculatorService"
        behaviorConfiguration="CalculatorServiceBehavior">
        <!-- ICalculator is exposed at the base address provided by
         host: http://localhost/servicemodelsamples/service.svc.  -->
       <endpoint address=""
              binding="wsHttpBinding"
              contract="Microsoft.ServiceModel.Samples.ICalculator" />
       ...
    </service>
</services>

Il servizio espone l'endpoint all'indirizzo di base fornito dall'host IIS o WAS. L'associazione è configurata con uno standard WSHttpBinding, che fornisce protocolli di comunicazione HTTP e di servizio Web standard per l'indirizzamento e la sicurezza. Il contratto è implementato ICalculator dal servizio.

Come configurato, è possibile accedere al servizio da un client tramite http://localhost/servicemodelsamples/service.svc nello stesso computer. Per consentire ai client nei computer remoti di accedere al servizio, è necessario specificare un nome di dominio completo anziché localhost.

Il framework non espone i metadati per impostazione predefinita. Di conseguenza, il servizio attiva ServiceMetadataBehavior e espone un endpoint di scambio di metadati (MEX) in http://localhost/servicemodelsamples/service.svc/mex. La configurazione seguente illustra questa operazione.

<system.serviceModel>
  <services>
    <service
        name="Microsoft.ServiceModel.Samples.CalculatorService"
        behaviorConfiguration="CalculatorServiceBehavior">
      ...
      <!-- the mex endpoint is exposed at
       http://localhost/servicemodelsamples/service.svc/mex -->
      <endpoint address="mex"
                binding="mexHttpBinding"
                contract="IMetadataExchange" />
    </service>
  </services>

  <!--For debugging purposes set the includeExceptionDetailInFaults
   attribute to true-->
  <behaviors>
    <serviceBehaviors>
      <behavior name="CalculatorServiceBehavior">
        <serviceMetadata httpGetEnabled="True"/>
        <serviceDebug includeExceptionDetailInFaults="False" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

Il client comunica usando un determinato tipo di contratto usando una classe client generata dallo strumento utilità metadati ServiceModel (Svcutil.exe). Questo client generato è contenuto nel file generatedClient.cs o generatedClient.vb. Questa utilità recupera i metadati per un determinato servizio e genera un client da usare dall'applicazione client per comunicare usando un determinato tipo di contratto. Il servizio ospitato deve essere disponibile per generare il codice client, perché il servizio viene usato per recuperare i metadati aggiornati.

Eseguire il comando seguente dal prompt dei comandi dell'SDK nella directory client per generare il proxy tipizzato:

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs

Per generare il client in Visual Basic, digitare quanto segue dal prompt dei comandi dell'SDK:

Svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /l:vb /out:generatedClient.vb

Usando il client generato, il client può accedere a un determinato endpoint di servizio configurando l'indirizzo e l'associazione appropriati. Analogamente al servizio, il client usa un file di configurazione (App.config) per specificare l'endpoint con cui desidera comunicare. La configurazione dell'endpoint client è costituita da un indirizzo assoluto per l'endpoint del servizio, l'associazione e il contratto, come illustrato nell'esempio seguente.

<client>
     <endpoint
         address="http://localhost/servicemodelsamples/service.svc"
         binding="wsHttpBinding"
         contract=" Microsoft.ServiceModel.Samples.ICalculator" />
</client>

L'implementazione client crea un'istanza del client e usa l'interfaccia tipizzata per iniziare a comunicare con il servizio, come illustrato nel codice di esempio seguente.

' Create a client
Dim client As New CalculatorClient()

' Call the Add service operation.
            Dim value1 = 100.0R
            Dim value2 = 15.99R
            Dim result = client.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)

' Call the Subtract service operation.
value1 = 145.00R
value2 = 76.54R
result = client.Subtract(value1, value2)
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result)

' Call the Multiply service operation.
value1 = 9.00R
value2 = 81.25R
result = client.Multiply(value1, value2)
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result)

' Call the Divide service operation.
value1 = 22.00R
value2 = 7.00R
result = client.Divide(value1, value2)
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result)

'Closing the client gracefully closes the connection and cleans up resources
// Create a client.
CalculatorClient client = new CalculatorClient();

// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

// Call the Subtract service operation.
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

// Call the Multiply service operation.
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

// Call the Divide service operation.
value1 = 22.00D;
value2 = 7.00D;
result = client.Divide(value1, value2);
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);

//Closing the client releases all communication resources.
client.Close();

Quando si esegue l'esempio, le richieste e le risposte dell'operazione vengono visualizzate nella finestra della console client. Premere INVIO nella finestra del client per chiudere il client.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

L'esempio Introduttivo illustra il modo standard per creare un servizio e un client. L'altra build Basic si basa su questo esempio per dimostrare funzionalità specifiche del prodotto.

Per configurare, compilare ed eseguire l'esempio

  1. Assicurati di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation.

  2. Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.

  3. Per eseguire l'esempio in un solo computer o tra computer diversi, seguire le istruzioni in Esecuzione degli esempi di Windows Communication Foundation.

Vedere anche