A chamada do jQuery ao WebService retorna o erro "Sem transporte"

163

Eu tenho o seguinte serviço web;

    [WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }

É padrão de estoque, sem alterações para os decoradores da classe.

Eu tenho esse método jQuery;

var webMethod = "http://localhost:54473/Service1.asmx/HelloWorld"; 

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    data: "{}",  
    dataType: "json",
    url: webMethod,
    success: function(msg){ alert(msg.d); },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert(errorThrown);
          }
});

É uma ação pós, porque mais tarde preciso postar dados nela.

Quando executo o jQuery, recebo um erro "Sem transporte" retornado.

Uma coisa que devo mencionar também é que o jQuery é armazenado em um arquivo HTML simples na minha máquina e o WebService está sendo executado na minha máquina também.

Não existe um código na página HTML, é simplesmente uma página da Web e não um projeto de # # ou algo assim.

Alguém pode me indicar a direção certa aqui?

griegs
fonte
Você pode acessar seu serviço da Web usando apenas um navegador?
Avitus
Desculpe, eu não percebi que este é um post diferente (editei este post, pensando que era meu), devo ter clicado no hiperlink para este em meu próprio post. Realmente sinto muito pelo proprietário do post = \
Erick Garcia
$ .support.cors = true; Se seu nó de extremidade estiver habilitado para CORS (ele responde corretamente com um cabeçalho Access-Control-Allow-Origin, etc), essa linha de código convencerá o jQuery a fazer uma solicitação de origem cruzada no IE8. Acabei de me deparar com isso mais cedo, esperando que isso poupe a alguns de vocês algum tempo e dor de cabeça.
precisa

Respostas:

95

Se a sua página jQuery não estiver sendo carregada http://localhost:54473, provavelmente esse problema está ocorrendo porque você está tentando fazer uma solicitação entre domínios.

Atualização 1 Dê uma olhada nesta postagem do blog .

Atualização 2 Se esse for realmente o problema (e suspeito que seja), convém verificar o JSONP como uma solução. Aqui estão alguns links que podem ajudar você a começar:

no.good.at.coding
fonte
4
Sim, provavelmente tem algo a ver com segurança.
thenengah
3
Não precisa ser localhost: 54473, apenas o mesmo domínio.
jcolebrand
7
@drachenstern Hm, eu sempre pensei (e pareço lembrar sempre de ler) que o esquema, host e porta precisavam ser os mesmos. Isso e isso e isso parecem apoiar minha maneira de pensar sobre o que constitui o mesmo domínio.
no.good.at.coding
@drachenstern Fico feliz em ajudar! Todo o material deste web é complicado - algo novo para aprender todos os dias :)
no.good.at.coding
1
@griegs É bom ouvir, mas observe que você não está realmente resolvendo o problema - isso só funcionará se o ambiente permitir solicitações entre domínios, pois você está apenas removendo as proteções de segurança que o jQuery coloca. Se o seu navegador não permitir, a configuração dessa propriedade não fará nada para você. Eu recomendaria colocar um pouco de esforço agora para colocar o JSONP no lugar. No mínimo, convém tentar e ver se forçar o suporte entre domínios do jQuery funciona com todos os navegadores que você planeja suportar. Também não posso comentar sobre quais outros problemas você poderá encontrar mais tarde!
No9ood.at.coding
253

Adicione isso: jQuery.support.cors = true;

Ele permite scripts entre sites no jQuery (introduzido após 1.4x, acredito).

Estávamos usando uma versão muito antiga do jQuery (1.3.2) e a trocamos pela 1.6.1. Tudo estava funcionando, exceto as chamadas .ajax (). A adição da linha acima corrigiu o problema.

SrBlanco
fonte
Um pouco mais de informação aqui: blueonionsoftware.com/…
Andrew Arnott
14
isso corrigiu meu problema, funcionou no chrome e no firefox, mas não no IE. adicionou-a ao topo do meu script e tudo foi bom
Peter
@SrBlanco Isso também corrige meu problema, obrigado por compartilhar essas informações.
dev
4
Muito bom conserto, eu tive o mesmo problema no Internet Explorer 9, quando eu estava solicitando um arquivo KML do mesmo domínio usando um caminho relativo ... mistérios do IE ...
Matteo Conta
obrigado. Sim, minhas chamadas de descanso pararam após 1,5 atualizações do jquery. esse código o corrigiu.
Ashraf
26

Eu tive o mesmo erro em uma página e adicionei estas linhas:

<!--[if lte IE 9]>
<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js'></script>
<![endif]-->

e finalmente funciona para mim;) não há mais erro no IE9.

bsuttor
fonte
6
Projeto Github: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest e XDomainRequest informações: blogs.msdn.com/b/ieinternals/archive/2010/05/13/… . Basicamente, o IE8 e o IE9 não suportam o CORS no objeto XMLHttpRequest. Você é forçado a usar o objeto XDomainRequest (o que é mais limitado. Pode ler as informações no segundo link).
Richardaday
7

Nenhuma das respostas propostas funcionou completamente para mim. Meu caso de uso é um pouco diferente (fazer um ajax chegar a um arquivo .json do S3 no IE9). A configuração jQuery.support.cors = true;se livrou doNo Transport erro, mas eu ainda estava recebendo Permission deniederros.

O que funcionou para mim foi usar o jQuery-ajaxTransport-XDomainRequest para forçar o IE9 a usar o XDomainRequest. Usar isso não exigiu configuraçãojQuery.support.cors = true;

rynop
fonte
6

eu resolvo isso usando dataType = 'jsonp' no lugar de dataType = 'json'

Abhishek
fonte
2
Para sua informação, isso realmente não funcionaria para a solicitação do pôster original, já que o jsonp não suporta o verbo POST, apenas GET.
Daniel Cox
ya ur certo, que eu usei para feeds Get da fbwall, google + etc usando ajax
Abhishek
Ainda vou dar um +1 porque ajudou no meu uso, Obrigado.
Manatherin 22/10/2013
0

Eu também tive esse problema e todas as soluções fornecidas acima falharam ou não foram aplicáveis ​​devido a restrições de serviço da web do cliente.

Para isso, adicionei um iframe na minha página que residia no servidor do cliente. Então, quando publicamos nossos dados no iframe e o iframe, os publicamos no serviço da web. Portanto, a referência entre domínios é eliminada.

Adicionamos uma verificação de origem bidirecional para confirmar apenas os dados de postagens de página autorizadas de e para o iframe.

Espero que ajude

<iframe style="display:none;" id='receiver' name="receiver" src="https://iframe-address-at-client-server">
 </iframe>

//send data to iframe
var hiddenFrame = document.getElementById('receiver').contentWindow;
hiddenFrame.postMessage(JSON.stringify(message), 'https://client-server-url');

//The iframe receives the data using the code:
window.onload = function () {
    var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
    var eventer = window[eventMethod];
    var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
    eventer(messageEvent, function (e) {
        var origin = e.origin;
        //if origin not in pre-defined list, break and return
        var messageFromParent = JSON.parse(e.data);
        var json = messageFromParent.data;

        //send json to web service using AJAX   
        //return the response back to source
        e.source.postMessage(JSON.stringify(aJAXResponse), e.origin);
    }, false);
}
Riju Mahna
fonte
0

Para mim, é uma história totalmente diferente.
Como esta página tem uma boa classificação nos mecanismos de pesquisa, devo adicionar meu caso e a solução aqui também.

Eu jqueryme construí comwebpack escolhendo apenas os módulos que uso. O ajax sempre falha com a mensagem "Sem transporte" como a única pista.

Após uma longa depuração, o problema acaba sendo XMLHttpRequestplugáveljquery e não é incluído por padrão.

Você precisa incluir explicitamente o jquery/src/ajax/xhrarquivo para fazer o ajax funcionar nos navegadores.

Sam curioso
fonte
-1

Eu o resolvi simplesmente removendo o domínio do URL da solicitação.

Before: https://some.domain.com/_vti_bin/service.svc

After: /_vti_bin/service.svc
Draghon
fonte
1
Sim, solicitação ajax do mesmo domínio jQuery em que o domínio não está especificado na URL. No meu caso, não precisei fazer uma solicitação entre sites e parece que ter o domínio no parâmetro url da solicitação ajax fez com que a solicitação se comportasse de alguma forma entre sites. Meu ambiente usa o Microsoft ForeFront com algumas regras de redirecionamento e é possível que isso esteja causando os problemas.
Draghon
então porque você está respondendo em questão em relação ao pedido ajax domínio cruzado
Naeem Shaikh
1
@ NaeemShaikh27, a natureza da solicitação (entre domínios versus mesmo domínio) não estava clara no OP; Eu estava abordando a questão, dados os parâmetros "óbvios" da questão. Independentemente disso, estou apenas dizendo "ei, eu recebi o mesmo erro, eis o que eu fiz" e se você gosta ou não (ou se é apropriado para SO), funcionou para mim. Agora, se você voltar e tornar a pergunta mais específica, minha resposta será completamente irrelevante.
Draghon 27/06