Hospedaje de un servicio WCF en una aplicación administrada

Para hospedar un servicio dentro de una aplicación administrada, incruste el código del servicio dentro del código de la aplicación administrada, defina un extremo para el servicio de manera imperativa mediante código, de manera declarativa mediante configuración o usando extremos predeterminados y, a continuación, cree una instancia de ServiceHost.

Para comenzar a recibir mensajes, llame al método Open en ServiceHost. Esto crea y abre el agente de escucha del servicio. Hospedar un servicio de esta manera se conoce a menudo como "autohospedaje", puesto que la aplicación administrada está haciendo el propio trabajo de hospedaje. Para cerrar el servicio, llame al método CommunicationObject.Close en ServiceHost.

Un servicio también se puede hospedar en un servicio de Windows administrado, en Internet Information Services (IIS) o en Servicio de activación de procesos de Windows (WAS). Para obtener más información sobre las opciones de hospedaje de un servicio, consulte Servicios de hospedaje.

Hospedar un servicio en una aplicación administrada es la opción más flexible porque es la que necesita una menor infraestructura para su implementación. Para obtener más información sobre los servicios de hospedaje en aplicaciones administradas, consulte Hospedaje en una aplicación administrada.

El siguiente procedimiento muestra cómo implementar un servicio autohospedado en una aplicación de consola.

Creación de un servicio autohospedado

  1. Cree una nueva aplicación de consola:

    1. Abra Visual Studio y seleccione Nuevo>Proyecto en el menú Archivo.

    2. En la lista Plantillas instaladas, seleccione Visual C# o Visual Basic y, a continuación, seleccione Escritorio de Windows.

    3. Seleccione la plantilla Aplicación de consola. Escriba SelfHost en el cuadro Nombre y, a continuación, elija Aceptar.

  2. Haga clic con el botón derecho en SelfHost en el Explorador de soluciones y seleccione Agregar referencia. Seleccione System.ServiceModel en la pestaña .NET y, a continuación, elija Aceptar.

    Sugerencia

    Si la ventana Explorador de soluciones no está visible, seleccione Explorador de soluciones en el menú Ver.

  3. Haga doble clic en Program.cs o Module1.vb en el Explorador de soluciones para abrirlo en la ventana de código si aún no lo está. Agregue las instrucciones siguientes en la parte superior del archivo:

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Defina e implemente un contrato de servicio. En este ejemplo se define un HelloWorldService que devuelve un mensaje en función de la entrada al servicio.

    [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

    Para obtener más información sobre cómo definir e implementar una interfaz de servicio, consulte los artículos sobre cómo definir un contrato de servicio y cómo definir un contrato de servicio.

  5. Al principio del método Main, cree una instancia de la clase Uri con la dirección base del servicio.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. Cree una instancia de la clase ServiceHost, pasando un Type que representa el tipo de servicio y el Identificador uniforme de recursos (URI) de la dirección base al ServiceHost(Type, Uri[]). Habilite la publicación de metadatos y, a continuación, llame al método Open en ServiceHost para inicializar el servicio y prepararlo para recibir mensajes.

    // 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

    En este ejemplo se usan puntos de conexión predeterminados, y este servicio no requiere ningún archivo de configuración. Si no se configura ningún extremo, el tiempo de ejecución crea uno para cada dirección base de cada contrato de servicio implementado por el servicio. Para obtener más información sobre los puntos de conexión predeterminados, consulte Configuración simplificada y Configuración simplificada de los servicios WCF.

  7. Presione Ctrl+Mayús+B para compilar la solución.

Probar el servicio

  1. Presione Ctrl+F5 para ejecutar el servicio.

  2. Abra el Cliente de prueba WCF.

    Sugerencia

    Para abrir el Cliente de prueba WCF, abra el símbolo del sistema para desarrolladores de Visual Studio y ejecute WcfTestClient.exe.

  3. Seleccione Agregar servicio en el menú Archivo.

  4. Escriba http://localhost:8080/hello en el cuadro de dirección y haga clic en Aceptar.

    Sugerencia

    Asegúrese de que el servicio se está ejecutando; de lo contrario, este paso producirá un error. Si ha cambiado la dirección base en el código, use dicha dirección en este paso.

  5. Haga doble clic en SayHello debajo del nodo Mis proyectos de servicios. Escriba su nombre en la columna Valor de la lista Solicitud y haga clic en Invocar.

    Aparecerá un mensaje de respuesta en la lista Respuesta.

Ejemplo

El siguiente ejemplo crea un objeto ServiceHost para hospedar un servicio de tipo HelloWorldService, y, a continuación, llama al método Open en ServiceHost. Se proporciona una dirección base mediante código, se habilita la publicación de metadatos y se usan extremos predeterminados.

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

Consulte también