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
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 selecione Área de Trabalho do Windows.
Selecione o modelo Aplicativo de console. Digite
SelfHost
no campo Nome e escolha OK.
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.
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
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.
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")
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.
Pressione Ctrl+Shift+B para criar a solução.
Teste o serviço
Pressione Ctrl+F5 para executar o serviço.
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.
Selecione Adicionar serviço no menu Arquivo.
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.
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
- Uri
- AppSettings
- ConfigurationManager
- Como: hospedar um serviço WCF no IIS
- Self-Host
- Serviços de hospedagem
- 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
- Associações fornecidas pelo sistema