Partilhar via


Como: Hospedar um serviço WCF em um aplicativo gerenciado

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

Para começar a receber mensagens, ligue Open para ServiceHost. Isso cria e abre o ouvinte para o serviço. Hospedar um serviço dessa maneira é muitas vezes referido como "auto-hospedagem" porque o aplicativo gerenciado está fazendo o trabalho de hospedagem em si. Para fechar o serviço, ligue CommunicationObject.Close para 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 Processos 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, pois requer a menor infraestrutura para ser implantada. Para obter mais informações sobre serviços de hospedagem em aplicativos gerenciados, consulte Hospedagem em um aplicativo gerenciado.

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

Criar um serviço auto-hospedado

  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, em seguida, selecione Área de Trabalho do Windows.

    3. Selecione o modelo Aplicativo de console. Digite SelfHost a caixa Nome e escolha OK.

  2. Clique com o botão direito do mouse em SelfHost no Gerenciador de Soluções e selecione Adicionar Referência. Selecione System.ServiceModel na guia .NET e, em seguida, escolha OK.

    Gorjeta

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

  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 seguintes instruções na parte superior do arquivo:

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Definir e implementar um contrato de serviços. 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
    

    Nota

    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 Main método, crie uma instância da Uri classe 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 ServiceHost classe, passando um Type que representa o tipo de serviço e o endereço base Uniform Resource Identifier (URI) para o ServiceHost(Type, Uri[]). Habilite a publicação de metadados e, em seguida, chame o Open método 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
    

    Nota

    Este exemplo usa pontos de extremidade padrão e nenhum arquivo de configuração é necessário para esse serviço. Se nenhum ponto de extremidade for configurado, o tempo de execução 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.

Testar o serviço

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

  2. Abra o cliente de teste WCF.

    Gorjeta

    Para abrir o WCF Test Client, 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 na caixa de endereço e clique em OK.

    Gorjeta

    Certifique-se de que o serviço está em execução ou esta etapa falhará. Se você alterou o endereço base no código, use o endereço base modificado nesta 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 ServiceHost objeto para hospedar um serviço do tipo HelloWorldServicee, em seguida, chama o Open método em ServiceHost. Um endereço base é fornecido no código, a publicação de metadados é habilitada e os 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

Consulte também