Condividi tramite


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 all'interno del codice dell'applicazione gestita, definire un endpoint per il servizio in modo imperativo nel codice, in modo dichiarativo tramite la configurazione o usare endpoint predefiniti e quindi creare un'istanza di ServiceHost.

Per iniziare a ricevere messaggi, chiamare Open su ServiceHost. Questo crea e apre il listener per il servizio. L'hosting di un servizio in questo modo viene spesso definito "self-hosting" perché l'applicazione gestita esegue il lavoro di hosting stesso. Per chiudere il servizio, chiamare CommunicationObject.Close su ServiceHost.

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

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

La procedura seguente illustra come implementare un servizio self-hosted in un'applicazione console.

Creare un servizio auto-ospitato

  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 Desktop di Windows.

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

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

    Suggerimento

    Se la finestra Esplora soluzioni non è visibile, selezionare Esplora soluzioni dal menu Visualizza .

  3. Fare doppio clic su Program.cs o 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. Questo esempio definisce un oggetto HelloWorldService che restituisce un messaggio basato sull'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. Nella parte superiore del Main metodo creare un'istanza della Uri classe con l'indirizzo di base per il 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'istanza di Type che rappresenta il tipo di servizio e l'URI (Uniform Resource Identifier) dell'indirizzo di base verso ServiceHost(Type, Uri[]). Abilitare la pubblicazione dei metadati e quindi chiamare il Open metodo su ServiceHost per inizializzare il servizio e prepararlo per ricevere i 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 {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

    Questo esempio usa gli endpoint predefiniti e non è necessario alcun file di configurazione per questo servizio. Se non sono configurati endpoint, il runtime crea un endpoint per ogni indirizzo di base per ogni contratto di servizio implementato dal servizio. Per altre informazioni sugli endpoint predefiniti, vedere Configurazione semplificata e Configurazione semplificata per i servizi WCF.

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

Testare il servizio

  1. Premere CTRL+F5 per eseguire il servizio.

  2. Aprire il client di 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. Selezionare Aggiungi servizio dal menu File .

  4. Digitare http://localhost:8080/hello nella casella indirizzo e fare clic su OK.

    Suggerimento

    Assicurarsi che il servizio sia in esecuzione, altrimenti questo passaggio fallirà. Se è stato modificato l'indirizzo di base nel codice, usare l'indirizzo di base modificato in questo passaggio.

  5. Fare doppio clic su SayHello nel nodo Progetti servizio personali. Digitare il nome nella colonna Valore nell'elenco Richiesta e fare clic su Richiama.

    Nell'elenco Risposta viene visualizzato un messaggio di risposta.

Esempio

Nell'esempio seguente viene creato un ServiceHost oggetto per ospitare un servizio di tipo HelloWorldServicee quindi viene chiamato il Open metodo su ServiceHost. Nel codice viene fornito un indirizzo di base, la pubblicazione dei metadati è abilitata e vengono usati gli 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 {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

Vedere anche