Share via


Procedura: Ospitare un servizio WCF in un'app 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 CommunicationObject.Close su ServiceHost.

Un servizio può essere ospitato anche in un servizio Windows gestito, in Internet Information Services (IIS) o nel servizio Attivazione processo Windows (WAS). Per altre informazioni sulle opzioni di hosting per un servizio, vedere Servizi Hosting.

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

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

Creare un servizio indipendente

  1. Creare una nuova applicazione console:

    1. Aprire Visual Studio e selezionare Nuovo>Progetto dal menu File.

    2. Nell'elenco Modelli installati selezionare Visual C# o Visual Basic e quindi selezionare Windows Desktop.

    3. Selezionare il modello App console. Digitare SelfHost nella casella Nome, quindi scegliere OK.

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

    Suggerimento

    Se la finestra Esplora soluzioni non è visibile, selezionarla nel menu Visualizza.

  3. Fare doppio clic su Program.cs o su Module1.vb in Esplora soluzioni per aprirlo nella finestra del codice, se non è già aperto. Aggiungere le istruzioni seguenti all'inizio del file :

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. 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]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    <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
    

    Nota

    Per altre informazioni su come definire e implementare un'interfaccia del servizio, vedere Procedura: Definire un contratto di servizio e Procedura: Implementare un contratto di servizio.

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

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. 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(Type, Uri[]). 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 (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();
    }
    
    ' 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
    

    Nota

    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 dal servizio. Per altre informazioni sugli endpoint predefiniti, vedere Configurazione semplificata e Configurazione semplificata per servizi WCF.

  7. Premere CTRL+MAIUSC+B per compilare la soluzione.

Eseguire il test del servizio

  1. Premere CTRL+F5 per eseguire il servizio.

  2. Aprire Client test WCF.

    Suggerimento

    Per aprire il client di test WCF, aprire il prompt dei comandi per gli sviluppatori per Visual Studio ed eseguire WcfTestClient.exe.

  3. Scegliere Aggiungi servizio dal menu File.

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

    Suggerimento

    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 nel nodo Progetti di servizio personali. Nella colonna Valore dell'elenco Richiesta digitare il proprio nome, quindi fare clic 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.

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("http://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();
            }
        }
    }
}
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("http://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

Vedi anche