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

Foi útil?

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.

Aprendizagem wcf http://ecx.images-amazon.com/images/i/41wya%2bnipml._bo2,204,203,200_pisitb-sicker-arrow-click.TOPRIRT.35,-76_AA240_SH20_OU01_.JPG

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.

Programming WCF Services

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top