Serviço de auto -host WCF - terminais em C#
-
25-09-2019 - |
Pergunta
Minhas primeiras tentativas de criar um serviço auto -hospedado. Tentando inventar algo que aceitará uma sequência de consultas e retornará algum texto, mas tem alguns problemas:
Toda a documentação fala sobre os pontos de extremidade criados automaticamente para cada endereço base se não forem encontrados em um arquivo de configuração. Este não parece ser o caso de mim, recebo a exceção "o serviço não tem pontos de extremidade do aplicativo ...". Especificar manualmente um ponto de extremidade básica como abaixo parece resolver o seguinte:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Description; namespace TestService { [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) { string baseaddr = "http://localhost:8080/HelloWorldService/"; Uri baseAddress = new Uri(baseaddr); // 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); host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr); host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr + "SayHello"); //for some reason a default endpoint does not get created here 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(); } } } }
Como eu configuraria isso para retornar o valor do nome em Sayhello (nome da string) quando solicitado assim: localhost: 8080/helloworldservice/sayhello? Nome = kyle
Estou tentando andar antes de correr, mas isso parece rastreando ...
Solução
Para sua pergunta sobre pontos de extremidade padrão que não estão sendo adicionados:
- Primeiro de tudo, esse é um recurso WCF 4 - ele funcionará no .NET 4
- Em seguida, os pontos de extremidade padrão são adicionados apenas ao seu host de serviço se você não tiver pontos de extremidade explícitos definidos na configuração e se você Não adicione pontos de extremidade no código! Ao adicionar esses dois terminais no código, você está assumindo o comando e o tempo de execução do WCF 4 não vai mexer com sua configuração
Confira este artigo da Biblioteca MSDN para obter mais informações sobre O que há de novo no WCF 4 para desenvolvedores. Ele mostra, entre outras coisas, como usar pontos de extremidade padrão - você basicamente define um endereço base para o seu serviço e abre o serviço - isso é tudo!
string baseaddr = "http://localhost:8080/HelloWorldService/";
Uri baseAddress = new Uri(baseaddr);
// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
//for some reason a default endpoint does not get created here
host.Open();
// here, you should now have one endpoint for each contract and binding
}
Você também pode adicionar os pontos de extremidade padrão explicitamente, no código, se desejar fazê -lo. Portanto, se você precisar adicionar seus próprios pontos de extremidade, mas deseja adicionar os pontos de extremidade padrão do sistema, poderá usar:
// define and add your own endpoints here
// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
// add all the system default endpoints to your host
host.AddDefaultEndpoints();
//for some reason a default endpoint does not get created here
host.Open();
// here, you should now have your own endpoints, plus
// one endpoint for each contract and binding
}
eu também Fonud esta postagem do blog aqui Para ser bastante esclarecedor - o blog de Christopher está cheio de postagens boas e muito úteis da WCF - altamente recomendado.
Outras dicas
Quanto aos livros - aqui está minha recomendação: o livro que eu sempre recomendo para subir e correr no WCF rapidamente é Aprendendo WCF por Michele Leroux Bustamante. Ela cobre todos os tópicos necessários e de uma maneira muito compreensível e acessível. Isso ensinará tudo - básico, tópicos intermediários, segurança, controle de transações e assim por diante - que você precisa saber para escrever serviços de alta qualidade e WCF.
Os tópicos mais avançados e mais detalhados para o WCF serão cobertos por Programação Serviços WCF por Juval Lowy. Ele realmente mergulha em todos os detalhes e tópicos técnicos e apresenta "a Bíblia" para a programação do WCF.
Se o IIS hospeda seu serviço da web, você obtém a página amigável "Você criou um serviço da web", assumindo que nada mais esteja errado. Você pode querer experimentar alguns tutoriais rápidos do WCF, como pode ser encontrado no livro de aprendizado da WCF do Bustamemente, eles vão rápido e explicam muito.
EDITAR: Aqui está uma página do MSDN que mostra uma maneira de obter parâmetros de string de consulta da sua chamada de serviço solicitada, bom exemplo. Ele mostra o uso do atributo [webget]. Se você não quisesse usar isso, você pode tentar usar OperaçãoContext para chegar aos internos da solicitação de entrada.