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?


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:


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.


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.


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;


6

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


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);
}

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.


-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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.