Tornar um serviço da Web do WCF funciona com solicitações GET

fundo
Eu criei serviços da web ASMX no passado e consegui acessar o serviço a partir do navegador da web e solicitações Ajax GET usando a convenção de endereço:
MyService.asmx/MyMethod?Param=xxx

Eu comecei a usar o WCF e criei um novo serviço da Web no meu projeto ASP.NET. Ele cria um arquivo com a extensão .svc, como MyService.svc.

Situação atual
Eu sou capaz de consumir o serviço usando o WcfTestClient que vem com o VS2008. Eu também sou capaz de criar meu próprio cliente WCF adicionando uma referência de serviço em outro projeto ou usando a linha de comando svcutil.exe para gerar o proxy e o arquivo de configuração.

O problema
Quando tento usar o serviço de um navegador usando MyService.svc/MyMethod?MyParam=xxx , recebo uma página em branco sem erros.

O que eu tentei
Eu já adicionei um basicHttpBinding ao web.config e o fiz HttpGetEnabled na configuração de comportamento. Eu também adicionei o [WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")] ao meu contrato de operação.

Eu já segui as informações nesta outra questão de estouro de pilha:
EndPoints REST / SOAP para um serviço WCF

No entanto, obtenho uma página em branco ou um erro HTTP 404 depois de seguir essas etapas. Não há nada especial sobre o código. Eu estou apenas pegando uma string como parâmetro e retornando “Hello xxx”. Essa é uma coisa básica do tipo prova de conceito “Hello WCF World”.


UPDATE – Aqui está o código relevante

 [ServiceContract] public interface IMyService { [WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")] [OperationContract] string MyMethod(string MyParam); } 

Web.Config – system.serviceModel Seção

                  

Analisando a seção service.Model web.config , vejo que você precisa adicionar um webHttpBinding e associar um endPointBehavior que inclua webHttpGet .

Seu contrato de operação está correto. Veja como sua seção de configuração system.serviceModel deve ser exibida para que você consiga consumir o serviço de uma solicitação HTTP GET.

                        

Certifique-se de atribuir um endereço diferente ao seu endpoint wsHttpBinding, caso contrário, você receberá um erro informando que você tem dois endpoints ouvindo no mesmo URI.

Outra opção é deixar o endereço em branco no wsHttpBinding, mas atribuir um endereço diferente ao serviço webHttpBinding. No entanto, isso também alterará seu endereço GET.

Por exemplo, se você atribuir o endereço como “asmx”, MyService.svc/asmx/MyMethod?MyParam=xxxx chamar seu serviço com o endereço ” MyService.svc/asmx/MyMethod?MyParam=xxxx “.

As solicitações normais do WCF são sempre solicitações SOAP – você não conseguirá fazer isso com apenas o seu navegador, você precisará do Cliente TestClient do WCF para isso.

Há um complemento para o WCF chamado de WCF REST Starter Kit (que também será incluído no WCF 4.0 com o .NET 4.0), que permite usar comandos HTTP GET / POST / PUT / DELETE para consultar serviços WCF e outros. Você precisa gravar seus serviços especificamente para o REST, porém – você não pode ter SOAP e REST na mesma chamada de serviço.

Marc

Como o marc_s diz , o REST Starter Kit pode ajudar, mas você também deve estar ciente de que o .NET 3.5 tem suporte para serviços REST diretamente nele. Não é tão completo quanto o que você pode fazer com o kit inicial, mas é útil.

A maneira como isso funciona é que você coloca um atributo [WebGet] em suas operações para indicar onde no URL os vários parâmetros devem vir:

 [WebGet(UriTemplate = "helloworld/{name}")] string Helloworld(string name); 

Veja este portal para toneladas de informação.

Observe que você pode ter o mesmo serviço exposto como SOAP e REST se você especificar vários terminais / ligações na configuração.