Chamando WCF / JSON / REST WebService do JavaScript usando jQuery / Ajax

9

Eu sei que há muitas perguntas sobre isso - acredite em mim, eu li muitas delas e tentei responder.

(Este projeto é para uma empresa interna lan, não para a internet)

Temos um webservice WCF que é RESTFUL e envia / recebe JSON, requer autenticação / credenciais NTLM (Curb também seria bom) para garantir que o usuário chamador (do navegador é quem eles dizem que são), e isso é negociado entre o navegador / cliente e o serviço pelas ligações do WCF:

 <bindings>
  <webHttpBinding>
    <binding name="webHttpBindingAuth">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Ntlm"/>
      </security>
    </binding>
  </webHttpBinding>
</bindings>

Usando o Fiddler, posso chamar os métodos do serviço GET e POST com êxito e, desde que ajuste o JSON que estamos enviando para o serviço da Web (para incluir o ID da sessão, por exemplo), ele será reproduzido com êxito.

Os problemas começaram quando tentamos usar JavaScript / jQuery para chamar o webservice; A idéia é que um servidor web forneça o HTML / JS ao navegador do cliente, o navegador deve então chamar o serviço Web WCF para obter uma sessão e permitir que um usuário execute algumas ações (temos 3 métodos no total).

Primeiramente, encontramos o problema do X-Domain, que tentamos resolver obtendo o servidor da web para retornar os cabeçalhos corretos (Access-Control-Allow-Origin). Isso não impediu que navegadores como o SRIron nos dissessem isso;

XMLHttpRequest cannot load http://{webServiceUri}/InstantMessagingService/chat/start/{username}. Origin http://{web**Server**Uri} is not allowed by Access-Control-Allow-Origin.

Depois disso, investiguei a possibilidade de usar o Silverlight (parece não oferecer suporte à autenticação NTLM sobre WebHttpBinding), o proxy reverso está fora, já que o servidor IIS que está sendo usado no dev não será usado em prod (eu acredite que é o WebSphere, mas não está sob nosso controle); Em seguida, olhei para isso:

link

O que me deixou com a impressão de que o serviço da Web do WCF era, de fato, o que precisava dizer ao navegador de onde era permitido chamá-lo (se isso faz sentido). Tendo implementado todo o código do exemplo, descobri que o ApplyClientBehavior nunca foi chamado para tentar retornar os cabeçalhos ao cliente (também monitorando isso no Fiddler). Mais algumas pesquisas no Google levaram-me a:

link

Como estamos acessando o serviço da web usando jQuery e não algum cliente / referência / proxy / aplicativo .NET. blah, estou pensando que não é possível pré-solicitar-enviar esses cabeçalhos para permitir acesso a o serviço. Além disso, o Fiddler parece pensar que está recebendo um 401 Unauthorized quando tenta chamar o método link ..

Aqui está a jQuery que estou usando para tentar fazer a chamada (eu forneci algumas configurações na esperança de que funcionasse):

var url = webserviceUrl + "chat/start/" + remoteUserUri;

$.ajax({
    type: 'GET',   
    url: url,
    crossDomain: true,
    beforeSend: function(xhr){ xhr.withCredentials = true; },
    contentType: "application/json; charset=utf-8",               
    success: function (data) { conversationStarted(data); },
    dataType: 'json'
}); 

Ok, se alguém tiver dicas ou ideias úteis, por favor, mande embora. Vou responder e editar etc. para garantir que isso seja mantido atualizado, espero não ter perdido nada (mas minhas cabeças estão girando um pouco no meu Google).

Além disso, eu sei que pode haver maneiras melhores de fazer isso, mas eu gostaria de fazer isso da maneira mais limpa e rápida de onde estou agora - ou seja, não há muitas mudanças de código, reescreve, etc. também postar configurações se as pessoas acharem que elas realmente são úteis.

    
por peteski 01.06.2011 в 18:29
fonte

2 respostas

3

No final, eu tive que trabalhar um pouco, nós conseguimos que os caras responsáveis pelo servidor web concordassem em servir um IFrame que apontasse para nossa página hospedada no IIS (a que continha o JS, etc.)

Em seguida, usando a mágica do WCF / Windows, hospedamos os serviços do WCF na porta 80, que contorna o material de origem do domínio X. Então eu posso ter REST / JSON sem ter que usar JSONP.

Eu sei que não é a resposta para a pergunta dada os critérios que eu especifiquei, mas acho que fiquei sem opções completamente no final.

    
por peteski 08.06.2011 / 16:58
fonte
2

Você pode usar o JSONP? Isso resolverá seu problema de vários domínios em um piscar de olhos.

    
por jvenema 01.06.2011 / 18:34
fonte