Condividi tramite


Procedura: ospitare un servizio WCF in un'applicazione gestita

Per ospitare un servizio all'interno di un'applicazione gestita, incorporare il codice per il servizio nel codice dell'applicazione, definire un endpoint per il servizio in modo imperativo nel codice, in modo dichiarativo tramite la configurazione o tramite endpoint predefiniti, quindi creare un'istanza di ServiceHost.

Per iniziare a ricevere messaggi, chiamare Open su ServiceHost. In tal modo viene creato e aperto il listener per il servizio. Questo tipo di hosting di un servizio viene spesso chiamato "self-hosting"" perché è la stessa applicazione gestita a svolgere il lavoro di hosting. Per chiudere il servizio, chiamare System.ServiceModel.Channels.CommunicationObject.Close su ServiceHost.

Un servizio può essere ospitato anche in un servizio Windows gestito, in Internet Information Services (IIS) o nel servizio di attivazione dei processi di Windows (WAS, Windows Process Activation Service). Per ulteriori informazioni su opzioni di hosting per un servizio, vedere Servizi host.

L'hosting di un servizio in un'applicazione gestita è l'opzione più flessibile perché richiede la distribuzione di un'infrastruttura minima. Per ulteriori informazioni su servizi di hosting nelle applicazioni gestite, vedere Hosting in un'applicazione gestita.

Nella procedura seguente viene illustrato come implementare un servizio indipendente in un'applicazione console.

Per creare un servizio indipendente

  1. Aprire Visual Studio 2010, scegliere Nuovo dal menu File, quindi Progetto.

  2. Nell'elenco Modelli installati selezionare Visual C#, Windows o Visual Basic, quindi Windows. In base alle impostazioni di Visual Studio 2010, sotto il nodo Altri linguaggi nell'elenco Modelli istallati potrebbero essere presenti una o entrambe queste opzioni.

  3. Selezionare Applicazione console dall'elenco Windows. Digitare SelfHost nella casella Nome, quindi fare clic su OK.

  4. Fare clic con il pulsante destro del mouse su SelfHost in Esplora soluzioni e selezionare Aggiungi riferimento. Selezionare System.ServiceModel nella scheda .NET, quindi fare clic su OK.

    ms731758.Tip(it-it,VS.100).gifSuggerimento:
    Se la finestra Esplora soluzioni non è visibile, selezionarla nel menu Visualizza.

  5. Fare doppio clic sul file Program.cs o Module1.vb nella finestra Esplora soluzioni per aprirlo nella finestra del codice. Aggiungere le seguenti istruzioni all'inizio del file.

    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
  6. Definire e implementare un contratto di servizio. In questo esempio viene definito un codice HelloWorldService che restituisce un messaggio in base all'input del servizio.

    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface
    
    Public Class HelloWorldService
        Implements IHelloWorldService
    
        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class
    
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    ms731758.note(it-it,VS.100).gifNota:
    Per ulteriori informazioni su modalità di definizione e di implementazione di un'interfaccia del servizio, vedere Procedura: definire un contratto di servizio di Windows Communication Foundation e Procedura: implementare un contratto di servizio di Windows Communication Foundation.

  7. All'inizio del metodo Main, creare un'istanza della classe Uri con l'indirizzo di base del servizio.

    Dim baseAddress As Uri = New Uri("https://localhost:8080/hello")
    
    Uri baseAddress = new Uri("https://localhost:8080/hello");
    
  8. Creare un'istanza della classe ServiceHost, passando un Type che rappresenta il tipo di servizio e l'URI (Uniform Resource Identifier) dell'indirizzo di base a ServiceHost. Abilitare la pubblicazione dei metadati, quindi chiamare il metodo Open sull'oggetto ServiceHost per inizializzare il servizio e prepararlo a ricevere messaggi.

    ' Create the ServiceHost.
    Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)
    
        ' Enable metadata publishing.
        Dim smb As New ServiceMetadataBehavior()
        smb.HttpGetEnabled = True
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
        host.Description.Behaviors.Add(smb)
    
        ' Open the ServiceHost to start listening for messages. Since
        ' no endpoints are explicitly configured, the runtime will create
        ' one endpoint per base address for each service contract implemented
        ' by the service.
        host.Open()
    
        Console.WriteLine("The service is ready at {0}", baseAddress)
        Console.WriteLine("Press <Enter> to stop the service.")
        Console.ReadLine()
    
        ' Close the ServiceHost.
        host.Close()
    
    End Using
    
    // Create the ServiceHost.
    using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
    {
        // Enable metadata publishing.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(smb);
    
        // Open the ServiceHost to start listening for messages. Since
        // no endpoints are explicitly configured, the runtime will create
        // one endpoint per base address for each service contract implemented
        // by the service.
        host.Open();
    
        Console.WriteLine("The service is ready at {0}", baseAddress);
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
    
        // Close the ServiceHost.
        host.Close();
    }
    
    ms731758.note(it-it,VS.100).gifNota:
    In questo esempio vengono utilizzati endpoint predefiniti e per il servizio non è necessario alcun file di configurazione. Se non è specificato alcun endpoint, il runtime ne crea uno per ogni indirizzo di base per ciascun contratto di servizio implementato. Per ulteriori informazioni su endpoint predefiniti, vedere Configurazione semplificata e Configurazione semplificata per servizi WCF.

  9. Per compilare la soluzione, premere CTRL+MAIUSC+B.

Per eseguire il test del servizio

  1. Premere CTRL+F5 per eseguire il servizio.

  2. Aprire Client di prova WCF.

    ms731758.Tip(it-it,VS.100).gifSuggerimento:
    Per visualizzare Client di prova WCF, aprire un prompt dei comandi di Visual Studio 2010, quindi eseguire WcfTestClient.exe.

  3. Scegliere Aggiungi servizio dal menu Progetto.

  4. Digitare https://localhost:8080/hello nella casella degli indirizzi, quindi fare clic su OK.

    ms731758.Tip(it-it,VS.100).gifSuggerimento:
    Verificare che il servizio sia in esecuzione. In caso contrario, il passaggio non viene eseguito. Se nel codice è stato modificato l'indirizzo di base, in questo passaggio utilizzare l'indirizzo di base modificato.

  5. Fare doppio clic su SayHello sotto il nodo Progetti di servizi. Nella colonna Valore dell'elenco Richiesta digitare il proprio nome, quindi fare cic su Richiama. Nell'elenco Risposta verrà visualizzato un messaggio di risposta.

Esempio

Nell'esempio seguente viene creato un oggetto ServiceHost per ospitare un servizio di tipo HelloWorldService, quindi viene chiamato il metodo Open su ServiceHost. Nel codice viene fornito un indirizzo di base, viene abilitata la pubblicazione di metadati e vengono utilizzati endpoint predefiniti.

Imports System.ServiceModel
Imports System.ServiceModel.Description

Module Module1

    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface
    
    Public Class HelloWorldService
        Implements IHelloWorldService

        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class

    Sub Main()
        Dim baseAddress As Uri = New Uri("https://localhost:8080/hello")

        ' Create the ServiceHost.
        Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)

            ' Enable metadata publishing.
            Dim smb As New ServiceMetadataBehavior()
            smb.HttpGetEnabled = True
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
            host.Description.Behaviors.Add(smb)

            ' Open the ServiceHost to start listening for messages. Since
            ' no endpoints are explicitly configured, the runtime will create
            ' one endpoint per base address for each service contract implemented
            ' by the service.
            host.Open()

            Console.WriteLine("The service is ready at {0}", baseAddress)
            Console.WriteLine("Press <Enter> to stop the service.")
            Console.ReadLine()

            ' Close the ServiceHost.
            host.Close()

        End Using

    End Sub

End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace SelfHost
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("https://localhost:8080/hello");

            // Create the ServiceHost.
            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                // Enable metadata publishing.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);

                // Open the ServiceHost to start listening for messages. Since
                // no endpoints are explicitly configured, the runtime will create
                // one endpoint per base address for each service contract implemented
                // by the service.
                host.Open();

                Console.WriteLine("The service is ready at {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service.");
                Console.ReadLine();

                // Close the ServiceHost.
                host.Close();
            }
        }
    }
}

Vedere anche

Attività

Procedura: ospitare un servizio WCF in IIS
Servizio indipendente
Procedura: definire un contratto di servizio di Windows Communication Foundation
Procedura: implementare un contratto di servizio di Windows Communication Foundation

Riferimento

Uri
AppSettings
ConfigurationManager

Concetti

Servizi host
Strumento ServiceModel Metadata Utility Tool (Svcutil.exe)
Utilizzo di associazioni per configurare servizi e client
Associazioni fornite dal sistema