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
Crie um novo aplicativo de console:
Abra o Visual Studio e selecione Novo projeto no menu Arquivo>.
Na lista Modelos Instalados, selecione Visual C# ou Visual Basic e, em seguida, selecione Área de Trabalho do Windows.
Selecione o modelo Aplicativo de console. Digite
SelfHost
a caixa Nome e escolha OK.
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.
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
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.
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")
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.
Pressione Ctrl+Shift+B para criar a solução.
Testar o serviço
Pressione Ctrl+F5 para executar o serviço.
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.
Selecione Adicionar serviço no menu Arquivo .
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.
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 HelloWorldService
e, 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
- Uri
- AppSettings
- ConfigurationManager
- Como: Hospedar um serviço WCF no IIS
- Auto-Anfitrião
- Serviços de Alojamento
- Como: Definir um contrato de serviço
- Como: Implementar um contrato de serviço
- Ferramenta Utilitário de Metadados ServiceModel (Svcutil.exe)
- Usando associações para configurar serviços e clientes
- Ligações fornecidas pelo sistema