jQuery Call to WebService возвращает ошибку «Нет транспорта» - PullRequest
163 голосов
/ 09 марта 2011

У меня есть следующий веб-сервис:

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

Это стандартный стандарт без изменений для декораторов классов.

У меня есть этот метод 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);
          }
});

Это действие публикации, потому что позже мне нужно отправить данные на него.

Когда я выполняю jQuery, я получаю сообщение об ошибке «Нет транспорта».

Одна вещь, которую я должен также упомянуть, эточто jQuery хранится в простом файле HTML на моем компьютере, и на моем компьютере также работает WebService.

На странице HTML нет кода, это просто веб-страница, а не проект ac # или что-либо еще.

Может кто-нибудь указать мне правильное направление здесь?

Ответы [ 7 ]

252 голосов
/ 22 июня 2011

Добавьте это: jQuery.support.cors = true;

Включает межсайтовый скриптинг в jQuery (я думаю, после 1.4x).

Мы использовали действительно старую версию jQuery (1.3.2) и обменял его на 1.6.1.Все работало, кроме вызовов .ajax ().Добавление вышеуказанной строки устранило проблему.

95 голосов
/ 09 марта 2011

Если ваша страница jQuery не загружается из http://localhost:54473, возможно, это связано с тем, что вы пытаетесь сделать междоменный запрос.

Обновление 1 Взгляните на это сообщение в блоге .

Обновление 2 Если это действительно проблема (и я подозреваю, что это так), вы можете проверить JSONP в качестве решения. Вот несколько ссылок, которые могут помочь вам начать:

26 голосов
/ 20 января 2014

У меня была такая же ошибка на странице, и я добавил следующие строки:

<!--[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]-->

и это, наконец, работает для меня;) больше нет ошибки в IE9.

7 голосов
/ 19 декабря 2013

Ни один из предложенных ответов полностью не сработал для меня.Мой вариант использования немного отличается (выполнение ajax для файла S3 .json в IE9).Установка jQuery.support.cors = true; избавила от ошибки No Transport, но я все еще получал Permission denied ошибки.

Что мне помогло, так это использование jQuery-ajaxTransport-XDomainRequest для принудительного примененияIE9 использовать XDomainRequest.Использование этого не требует настройки jQuery.support.cors = true;

6 голосов
/ 13 октября 2012

Я решаю это, используя dataType = 'jsonp' вместо dataType = 'json'

0 голосов
/ 17 декабря 2014

У меня тоже возникла эта проблема, и все приведенные выше решения либо не сработали, либо были неприменимы из-за ограничений клиентского веб-сервиса.

Для этого я добавил на свою страницу iframe, который находился на сервере клиента. Поэтому, когда мы публикуем наши данные в iframe, а iframe отправляет их в веб-сервис. Следовательно, междоменная ссылка исключается.

Мы добавили двустороннюю проверку происхождения, чтобы подтвердить, что только авторизованные данные публикуются на странице и из iframe.

Надеюсь, это поможет

<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 голосов
/ 04 июня 2014

Я решил это, просто удалив домен из URL запроса.

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

After: /_vti_bin/service.svc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...