Como: hospedar um serviço do WCF em um aplicativo gerenciado

Para hospedar um serviço dentro de um aplicativo gerenciado, insira o código do serviço dentro do código do aplicativo gerenciado, defina um ponto de extremidade para o serviço de forma imperativa no código, declarativamente por meio da configuração ou usando pontos de extremidade padrão e, em seguida, crie uma instância de ServiceHost.

Para começar a receber mensagens, chame Open no ServiceHost. Isso cria e abre o ouvinte do serviço. Hospedar um serviço dessa forma geralmente é chamado de "autohospedagem" porque o aplicativo gerenciado está fazendo o próprio trabalho de hospedagem. Para fechar o host de serviço, chame CommunicationObject.Close no ServiceHost.

Um serviço também pode ser hospedado em um serviço Gerenciado do Windows, no IIS (Serviços de Informações da Internet) ou no WAS (Serviço de Ativação de Processo do Windows). Para obter mais informações sobre opções de hospedagem para um serviço, consulte Serviços de hospedagem.

Hospedar um serviço em um aplicativo gerenciado é a opção mais flexível porque requer a infraestrutura mínima para implantar. Para obter mais informações sobre como hospedar serviços em aplicativos gerenciados, consulte Hospedagem em um aplicativo gerenciado.

O seguinte procedimento demonstra como implementar um serviço auto-hospedado em um aplicativo de console.

Criar um serviço autohospedado

  1. Crie um novo aplicativo de console:

    1. Abra o Visual Studio e selecione Novo>Projeto no menu Arquivo.

    2. Na lista Modelos Instalados, selecione Visual C# ou Visual Basic e selecione Área de Trabalho do Windows.

    3. Selecione o modelo Aplicativo de console. Digite SelfHost no campo Nome e escolha OK.

  2. Clique com o botão direito em SelfHost em Gerenciador de soluções e selecione Adicionar referência. Selecione System.ServiceModel na guia .NET e escolha OK.

    Dica

    Se a janela Gerenciador de soluções não estiver visível, selecione Gerenciador de soluções no menu Visualização.

  3. Clique duas vezes em Program.cs ou Module1.vb no Gerenciador de Soluções para abri-lo na janela de código, se ainda não estiver aberto. Adicione as instruções a seguir à parte superior do arquivo:

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Defina e implemente um contrato de serviço. Este exemplo define um HelloWorldService que retorna uma mensagem com base na entrada para o serviço.

    [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
    

    Observação

    Para obter mais informações sobre como definir e implementar uma interface de serviço, consulte Como definir um contrato de serviço e Como implementar um contrato de serviço.

  5. Na parte superior do método Main, crie uma instância da classe Uri com o endereço base para o serviço.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. Crie uma instância da classe ServiceHost, passando um Type que representa o tipo de serviço e o URI (Uniform Resource Identifier) do endereço base para o ServiceHost(Type, Uri[]). Habilite a publicação de metadados e chame o método Open no ServiceHost para inicializar o serviço e prepará-lo para receber mensagens.

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

    Observação

    Esse exemplo usa pontos de extremidade padrão e nenhum arquivo de configuração é necessário para esse serviço. Se nenhum ponto de extremidade estiver configurado, o runtime criará um ponto de extremidade para cada endereço base para cada contrato de serviço implementado pelo serviço. Para obter mais informações sobre pontos de extremidade padrão, consulte Configuração simplificada e Configuração simplificada para serviços WCF.

  7. Pressione Ctrl+Shift+B para criar a solução.

Teste o serviço

  1. Pressione Ctrl+F5 para executar o serviço.

  2. Abra o Cliente de teste WCF.

    Dica

    Para abrir o Cliente de teste do WCF, abra o Prompt de comando do Desenvolvedor para Visual Studio e execute WcfTestClient.exe.

  3. Selecione Adicionar serviço no menu Arquivo.

  4. Digite http://localhost:8080/hello no campo de endereço e clique em OK.

    Dica

    Verifique se o serviço está em execução ou se essa etapa falhará. Se você alterou o endereço base no código, use o endereço base modificado nessa etapa.

  5. Clique duas vezes em SayHello no nó Meus projetos de serviço. Digite seu nome na coluna Valor na lista Solicitação e clique em Invocar.

    Uma mensagem de resposta aparece na lista Resposta.

Exemplo

O exemplo a seguir cria um objeto ServiceHost para hospedar um serviço de tipo HelloWorldService, e, em seguida, chama o método Open no ServiceHost. Um endereço base é fornecido no código, a publicação de metadados está habilitada e pontos de extremidade padrão são usados.

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

Confira também