Condividi tramite


Procedura: ospitare ed eseguire un servizio Windows Communication Foundation di base

Questa è la terza delle sei attività necessarie per creare un servizio Windows Communication Foundation (WCF) di base e un client in grado di chiamare il servizio. Per una panoramica di tutte e sei le attività, vedere l'argomento Esercitazione introduttiva.

In questo argomento viene illustrato come eseguire un servizio Windows Communication Foundation (WCF) di base. Questa procedura è costituita dai passaggi seguenti:

  • Creare un indirizzo di base per il servizio.

  • Creare un host del servizio per il servizio.

  • Consentire lo scambio di metadati.

  • Aprire l’host del servizio.

Nell'esempio riportato dopo la procedura, viene fornito un elenco completo del codice scritto per questa attività. Aggiungere il codice riportato di seguito al metodo Main() definito nella classe Program, che è stata generata al momento della creazione della soluzione Service.

Per configurare un indirizzo di base per il servizio

  1. Creare un'istanza Uri per l'indirizzo di base del servizio. L'URI specifica lo schema HTTP, il computer locale, il numero di porta 8000 e il percorso ServiceModelSample/Service del servizio specificato per lo spazio dei nomi del servizio all'interno del contratto del servizio.

    Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")
    
    Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");
    

Per ospitare il servizio

  1. Importare lo spazio dei nomi System.ServiceModel.Description. Questa riga di codice deve essere inserita all'inizio del file Program.cs/Program.vb con il resto delle istruzioni using o imports.

    Imports System.ServiceModel.Description
    
    using System.ServiceModel.Description;
    
  2. Creare una nuova istanza ServiceHost per ospitare il servizio. È necessario specificare il tipo che implementa il contratto di servizio e l'indirizzo di base. Per questo esempio, l'indirizzo di base è https://localhost:8000/ServiceModelSamples/Service e CalculatorService è il tipo che implementa il contratto di servizio.

    Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
    
    ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
  3. Aggiungere un'istruzione try-catch che intercetta un elemento CommunicationException e aggiungere il codice ai successivi tre passaggi nel blocco try. La clausola catch deve visualizzare un messaggio di errore, quindi chiamare selfHost.Abort().

    Try
        ' ...
    Catch ce As CommunicationException
        Console.WriteLine("An exception occurred: {0}", ce.Message)
        selfHost.Abort()
    End Try
    
    try
    {
        // ...
    }
    catch (CommunicationException ce)
    {
        Console.WriteLine("An exception occurred: {0}", ce.Message);
        selfHost.Abort();
    }
    
  4. Aggiungere un endpoint che espone il servizio. A tale scopo, è necessario specificare il contratto esposto dall'endpoint, un'associazione e l'indirizzo per l'endpoint. Per questo esempio, specificare ICalculator come contratto, WSHttpBinding come associazione e CalculatorService come indirizzo. Si noti che in questo caso l'indirizzo endpoint è un indirizzo relativo. L'indirizzo completo dell'endpoint è costituito dalla combinazione dell’indirizzo di base e dell'indirizzo dell'endpoint. In questo caso l'indirizzo completo è https://localhost:8000/ServiceModelSamples/Service/CalculatorService.

    ' Add a service endpoint
    selfHost.AddServiceEndpoint( _
        GetType(ICalculator), _
        New WSHttpBinding(), _
        "CalculatorService")
    
    selfHost.AddServiceEndpoint(
        typeof(ICalculator),
        new WSHttpBinding(),
        "CalculatorService");
    
    ms730935.note(it-it,VS.100).gifNota:
    A partire da .NET Framework 4, se non è stato configurato esplicitamente alcun endpoint per il servizio, il runtime aggiunge endpoint predefiniti quando viene aperto l'oggetto ServiceHost. In questo esempio viene aggiunto un endpoint predefinito in modo esplicito. Per ulteriori informazioni su endpoint, associazioni e comportamenti predefiniti, vedere Configurazione semplificata e Configurazione semplificata per servizi WCF.

  5. Consentire lo scambio di metadati. A questo scopo, aggiungere il comportamento dei metadati di un servizio. Creare innanzitutto un'istanza ServiceMetadataBehavior, impostare la proprietà HttpGetEnabled su true, quindi aggiungere il nuovo comportamento al servizio. Per ulteriori informazioni su problemi relativi alla sicurezza durante la pubblicazione di metadati, vedere Security Considerations with Metadata.

    ' Enable metadata exchange
    Dim smb As New ServiceMetadataBehavior()
    smb.HttpGetEnabled = True
    selfHost.Description.Behaviors.Add(smb)
    
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    selfHost.Description.Behaviors.Add(smb);
    
  6. Aprire ServiceHost e attendere i messaggi in arrivo. Quando l'utente preme il tasto INVIO, chiudere ServiceHost.

    selfHost.Open()
    Console.WriteLine("The service is ready.")
    Console.WriteLine("Press <ENTER> to terminate service.")
    Console.WriteLine()
    Console.ReadLine()
    
    ' Close the ServiceHostBase to shutdown the service.
    selfHost.Close()
    
    selfHost.Open();
    Console.WriteLine("The service is ready.");
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.WriteLine();
    Console.ReadLine();
    
    // Close the ServiceHostBase to shutdown the service.
    selfHost.Close();
    

Per verificare il funzionamento del servizio

  1. Eseguire service.exe da Visual Studio. In caso di esecuzione in Windows Vista, il servizio deve essere eseguito con privilegi di amministratore. Poiché Visual Studio è stato eseguito con privilegi di amministratore, anche service.exe viene eseguito con privilegi di amministratore. È inoltre possibile avviare un nuovo prompt dei comandi che esegua il servizio con privilegi di amministratore e utilizzarlo per eseguire service.exe.

  2. Aprire Internet Explorer e accedere alla pagina di debug del servizio all'indirizzo https://localhost:8000/ServiceModelSamples/Service.

Esempio

Nell'esempio seguente sono inclusi il contratto di servizio e l'implementazione dai passaggi precedenti nell'esercitazione e l'hosting del servizio in un'applicazione console. Compilare quanto segue in un eseguibile denominato Service.exe.

Assicurarsi di fare riferimento a System.ServiceModel.dll al momento di compilare il codice.

Imports System
Imports System.ServiceModel
Imports System.ServiceModel.Description

Module Service
    ' 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
        <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

    ' Service class that implements the service contract.
    ' Added code to write output to the console window.
    Public Class CalculatorService
        Implements ICalculator
        Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
            Dim result As Double = n1 + n2
            Console.WriteLine("Received Add({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function

        Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
            Dim result As Double = n1 - n2
            Console.WriteLine("Received Subtract({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function

        Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
            Dim result As Double = n1 * n2
            Console.WriteLine("Received Multiply({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function

        Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
            Dim result As Double = n1 / n2
            Console.WriteLine("Received Divide({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function
    End Class

    Class Program
        Shared Sub Main()
            ' Step 1 of the address configuration procedure: Create a URI to serve as the base address.
            Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")

            ' Step 2 of the hosting procedure: Create ServiceHost
            Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
            Try

                ' Step 3 of the hosting procedure: Add a service endpoint.
                ' Add a service endpoint
                selfHost.AddServiceEndpoint( _
                    GetType(ICalculator), _
                    New WSHttpBinding(), _
                    "CalculatorService")

                ' Step 4 of the hosting procedure: Enable metadata exchange.
                ' Enable metadata exchange
                Dim smb As New ServiceMetadataBehavior()
                smb.HttpGetEnabled = True
                selfHost.Description.Behaviors.Add(smb)

                ' Step 5 of the hosting procedure: Start (and then stop) the service.
                selfHost.Open()
                Console.WriteLine("The service is ready.")
                Console.WriteLine("Press <ENTER> to terminate service.")
                Console.WriteLine()
                Console.ReadLine()

                ' Close the ServiceHostBase to shutdown the service.
                selfHost.Close()
            Catch ce As CommunicationException
                Console.WriteLine("An exception occurred: {0}", ce.Message)
                selfHost.Abort()
            End Try
        End Sub
    End Class
using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Microsoft.ServiceModel.Samples
{
    // 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);
    }

    // Service class that implements the service contract.
    // Added code to write output to the console window.
    public class CalculatorService : ICalculator
    {
        public double Add(double n1, double n2)
        {
            double result = n1 + n2;
            Console.WriteLine("Received Add({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Subtract(double n1, double n2)
        {
            double result = n1 - n2;
            Console.WriteLine("Received Subtract({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Multiply(double n1, double n2)
        {
            double result = n1 * n2;
            Console.WriteLine("Received Multiply({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Divide(double n1, double n2)
        {
            double result = n1 / n2;
            Console.WriteLine("Received Divide({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            // Step 1 of the address configuration procedure: Create a URI to serve as the base address.
            Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");

            // Step 2 of the hosting procedure: Create ServiceHost
            ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

            try
            {


                // Step 3 of the hosting procedure: Add a service endpoint.
                selfHost.AddServiceEndpoint(
                    typeof(ICalculator),
                    new WSHttpBinding(),
                    "CalculatorService");


                // Step 4 of the hosting procedure: Enable metadata exchange.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb);

                // Step 5 of the hosting procedure: Start (and then stop) the service.
                selfHost.Open();
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                selfHost.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);
                selfHost.Abort();
            }

        }
    }
}
ms730935.note(it-it,VS.100).gifNota:
Servizi come questo richiedono l'autorizzazione per registrare gli indirizzi HTTP nel computer per l'ascolto. Gli account amministratore dispongono di questa autorizzazione, ma agli account non amministratore è necessario concedere l'autorizzazione per spazi dei nomi HTTP. Per ulteriori informazioni su come configurare prenotazioni dello spazio dei nomi, vedere Configurazione di HTTP e HTTPS. In caso di esecuzione in Visual Studio, il servizio.exe deve essere eseguito con privilegi di amministratore.

Il servizio è ora in esecuzione. Accedere a Procedura: creare un client di Windows Communication Foundation. Per informazioni sulla risoluzione dei problemi, vedere Risoluzione dei problemi relativi all'esercitazione introduttiva.

Vedere anche

Attività

Esempio della guida introduttiva
Servizio indipendente