Condividi tramite


Esercitazione: Ospitare ed eseguire un servizio Windows Communication Foundation di base

Questa esercitazione descrive la terza delle cinque attività necessarie per creare un'applicazione Windows Communication Foundation (WCF) di base. Per una panoramica delle esercitazioni, vedere Esercitazione: Introduzione alle applicazioni Windows Communication Foundation.

L'attività successiva per la creazione di un'applicazione WCF consiste nell'ospitare un servizio WCF in un'applicazione console. Un servizio WCF espone uno o più endpoint, ognuno dei quali espone una o più operazioni del servizio. Un endpoint di servizio specifica le informazioni seguenti:

  • Indirizzo in cui è possibile trovare il servizio.
  • Associazione che contiene le informazioni che descrivono come un client deve comunicare con il servizio.
  • Contratto che definisce la funzionalità fornita dal servizio ai client.

In questa esercitazione apprenderai a:

  • Creare e configurare un progetto di app console per l'hosting di un servizio WCF.
  • Aggiungere codice per ospitare il servizio WCF.
  • Aggiornare il file di configurazione.
  • Avviare il servizio WCF e verificare che sia in esecuzione.

Creare e configurare un progetto di app console per l'hosting del servizio

  1. Creare un progetto di app console in Visual Studio:

    1. Dal menu File selezionare Apri>Progetto/soluzione e passare alla soluzione GettingStarted creata in precedenza (GettingStarted.sln). Selezionare Apri.

    2. Dal menu Visualizza selezionare Esplora soluzioni.

    3. Nella finestra Esplora soluzioni selezionare la soluzione GettingStarted (nodo superiore) e quindi selezionare Aggiungi>Nuovo progetto dal menu di scelta rapida.

    4. Nella finestra Aggiungi nuovo progetto selezionare la categoria Desktop di Windows in Visual C# o Visual Basic.

    5. Selezionare il modello di app console (.NET Framework) e immettere GettingStartedHost per il nome. Seleziona OK.

  2. Aggiungere un riferimento nel progetto GettingStartedHost al progetto GettingStartedLib:

    1. Nella finestra Esplora soluzioni, selezionare la cartella Riferimenti nel progetto GettingStartedHost e quindi selezionare Aggiungi riferimento dal menu di scelta rapida.

    2. Nella finestra di dialogo Aggiungi riferimento, in Progetti sul lato sinistro della finestra selezionare Soluzione.

    3. Selezionare GettingStartedLib nella sezione centrale della finestra e quindi selezionare OK.

      Questa azione rende i tipi definiti nel progetto GettingStartedLib disponibili per il progetto GettingStartedHost.

  3. Aggiungere un riferimento nel progetto di GettingStartedHostv all'assembly System.ServiceModel:

    1. Nella finestra Esplora soluzioni, selezionare la cartella Riferimenti nel progetto GettingStartedHost e quindi selezionare Aggiungi riferimento dal menu di scelta rapida.

    2. Nella finestra Aggiungi riferimento, in Assembly a sinistra della finestra selezionare Framework.

    3. Selezionare System.ServiceModel e quindi selezionare OK.

    4. Salvare la soluzione selezionando File>Salva tutto.

Aggiungere codice per ospitare il servizio

Per ospitare il servizio, aggiungere codice per eseguire la procedura seguente:

  1. Creare un URI per l'indirizzo di base.
  2. Creare un'istanza di classe per l'hosting del servizio.
  3. Creare un endpoint di servizio.
  4. Consentire lo scambio di metadati.
  5. Aprire l'host del servizio per l'ascolto dei messaggi in arrivo.

Apportare le modifiche seguenti al codice:

  1. Aprire il file Program.cs o Module1.vb nel progetto GettingStartedHost e sostituirlo con il codice seguente:

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using GettingStartedLib;
    
    namespace GettingStartedHost
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Step 1: Create a URI to serve as the base address.
                Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
    
                // Step 2: Create a ServiceHost instance.
                ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
                try
                {
                    // Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
    
                    // Step 4: Enable metadata exchange.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    selfHost.Description.Behaviors.Add(smb);
    
                    // Step 5: Start the service.
                    selfHost.Open();
                    Console.WriteLine("The service is ready.");
    
                    // Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.");
                    Console.WriteLine();
                    Console.ReadLine();
                    selfHost.Close();
                }
                catch (CommunicationException ce)
                {
                    Console.WriteLine("An exception occurred: {0}", ce.Message);
                    selfHost.Abort();
                }
            }
        }
    }
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    Imports GettingStartedLib.GettingStartedLib
    
    Module Service
    
        Class Program
            Shared Sub Main()
                ' Step 1: Create a URI to serve as the base address.
                Dim baseAddress As New Uri("http://localhost:8000/GettingStarted/")
    
                ' Step 2: Create a ServiceHost instance.
                Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
               Try
    
                    ' Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint( _
                        GetType(ICalculator), _
                        New WSHttpBinding(), _
                        "CalculatorService")
    
                    ' Step 4: Enable metadata exchange.
                    Dim smb As New ServiceMetadataBehavior()
                    smb.HttpGetEnabled = True
                    selfHost.Description.Behaviors.Add(smb)
    
                    ' Step 5: Start the service.
                    selfHost.Open()
                    Console.WriteLine("The service is ready.")
    
                    ' Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.")
                    Console.WriteLine()
                    Console.ReadLine()
                    selfHost.Close()
    
                Catch ce As CommunicationException
                    Console.WriteLine("An exception occurred: {0}", ce.Message)
                    selfHost.Abort()
                End Try
            End Sub
        End Class
    
    End Module
    

    Per informazioni sul funzionamento di questo codice, vedere Passaggi del programma di hosting del servizio.

  2. Aggiornare le proprietà del progetto:

    1. Nella finestra Esplora soluzioni selezionare la cartella GettingStartedHost e quindi selezionare Proprietà dal menu di scelta rapida.

    2. Nella pagina delle proprietà GettingStartedHost selezionare la scheda applicazione:

      • Per i progetti C# selezionare GettingStartedHost.Program dall'elenco Oggetti di avvio.

      • Per i progetti Visual Basic selezionare Service.Program dall'elenco Oggetti di avvio.

    3. Dal menu File selezionare Salva tutto.

Verificare che il servizio funzioni

  1. Compilare la soluzione e quindi eseguire l'applicazione console GettingStartedHost dall'interno di Visual Studio.

    Il servizio deve essere eseguito con i privilegi di amministratore. Poiché Visual Studio è stato aperto con privilegi di amministratore, quando si esegue GettingStartedHost in Visual Studio, l'applicazione viene eseguita anche con privilegi di amministratore. In alternativa, è possibile aprire un nuovo prompt dei comandi come amministratore (selezionare Altro>esegui come amministratore dal menu di scelta rapida) ed eseguire GettingStartedHost.exe al suo interno.

  2. Aprire un Web browser e passare alla pagina del servizio all'indirizzo http://localhost:8000/GettingStarted/.

    Nota

    Servizi come questo richiedono l'autorizzazione appropriata per registrare gli indirizzi HTTP nel computer per l'ascolto. Gli account amministratore dispongono di questa autorizzazione, ma agli account senza privilegi di amministratore è necessario concedere l'autorizzazione per gli spazi dei nomi HTTP. Per altre informazioni su come configurare le prenotazioni dello spazio dei nomi, vedere Configuring HTTP and HTTPS (Configurazione di HTTP e HTTPS).

Passaggi del programma di hosting del servizio

I passaggi nel codice aggiunto all'host del servizio sono descritti come segue:

  • Passaggio 1: creare un'istanza della classe Uri per contenere l'indirizzo di base del servizio. Un URL che contiene un indirizzo di base ha un URI facoltativo che identifica un servizio. L'indirizzo di base è formattato come segue: <transport>://<machine-name or domain><:optional port #>/<optional URI segment>. L'indirizzo di base per il servizio calcolatrice usa il trasporto HTTP, localhost, la porta 8000 e il segmento URI GettingStarted.

  • Passaggio 2: creare un'istanza della classe ServiceHost, che viene usata per ospitare il servizio. Il costruttore accetta due parametri: il tipo di classe che implementa il contratto di servizio e l'indirizzo di base del servizio.

  • Passaggio 3: Creare un'istanza di ServiceEndpoint. Un endpoint di un servizio è composto da un indirizzo, un'associazione e un contratto di servizio. Il costruttore ServiceEndpoint è costituito dal tipo di interfaccia del contratto di servizio, da un'associazione e da un indirizzo. Il contratto di servizio è ICalculator, definito e implementato nel tipo di servizio. L'associazione per questo esempio è WSHttpBinding, che è un'associazione predefinita e si connette agli endpoint conformi alle specifiche WS-*. Per ulteriori informazioni sulle associazioni di WCF, vedere Panoramica sulle associazioni di Windows Communication Foundation. Accodare l'indirizzo all'indirizzo di base per identificare l'endpoint. Il codice specifica l'indirizzo come CalculatorService e l'indirizzo completo per l'endpoint come http://localhost:8000/GettingStarted/CalculatorService.

    Importante

    Per .NET Framework versione 4 e successive, l'aggiunta di un endpoint di servizio è facoltativa. Per queste versioni, se non si aggiunge il codice o la configurazione, WCF aggiunge un endpoint predefinito per ogni combinazione di indirizzo di base e contratto implementato dal servizio. Per altre informazioni sugli endpoint predefiniti, vedere Specifica di un indirizzo endpoint. Per altre informazioni su endpoint, associazioni e comportamenti predefiniti, vedere Simplified Configuration (Configurazione semplificata) e Simplified Configuration for WCF Services (Configurazione semplificata per servizi WCF).

  • Passaggio 4: viene abilitato lo scambio di metadati. I client usano lo scambio di metadati per generare proxy per chiamare le operazioni del servizio. Per abilitare lo scambio di metadati, creare un'istanza di ServiceMetadataBehavior, impostarne la proprietà HttpGetEnabled su true e aggiungere l'oggetto ServiceMetadataBehavior all'insieme Behaviors dell'istanza di ServiceHost.

  • Passaggio 5: Aprire ServiceHost per ascoltare i messaggi in arrivo. L'applicazione attende di premere INVIO. Dopo che l'applicazione crea un'istanza di ServiceHost, esegue un blocco try/catch. Per altre informazioni sull'intercettazione sicura delle eccezioni generate da ServiceHost, vedere Usare Close e Abort per rilasciare le risorse client WCF.

Importante

Quando si aggiunge una libreria di servizi WCF, Visual Studio lo ospita se viene eseguito il debug avviando un host del servizio. Per evitare conflitti, è possibile impedire a Visual Studio di ospitare la libreria di servizi WCF.

  1. Selezionare il progetto GettingStartedLib di Esplora soluzioni e scegliere Proprietà dal menu di scelta rapida.
  2. Selezionare Opzioni WCF e deselezionare Avvia host servizio WCF durante il debug di un altro progetto nella stessa soluzione.

Passaggi successivi

Questa esercitazione ha descritto come:

  • Creare e configurare un progetto di app console per l'hosting di un servizio WCF.
  • Aggiungere codice per ospitare il servizio WCF.
  • Aggiornare il file di configurazione.
  • Avviare il servizio WCF e verificare che sia in esecuzione.

Passare all'esercitazione successiva per informazioni su come creare un client WCF.