jQuery Call to WebService возвращает ошибку «Нет транспорта»

162

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

    [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 нет кода, на котором это просто веб-страница, а не проект С# или что-то еще.

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

  • 0
    Можете ли вы получить доступ к своему веб-сервису только с помощью браузера?
  • 0
    Извините, я не заметил, что это другой пост (я редактировал этот пост, думая, что он мой), я, должно быть, нажал на гиперссылку на этот пост в своем посте. Очень жаль владельца поста = \
Показать ещё 1 комментарий
Теги:
web-services

7 ответов

95
Лучший ответ

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

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

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

  • 4
    Да, возможно, это как-то связано с безопасностью.
  • 3
    Это не должно быть localhost: 54473, это просто должен быть тот же домен.
Показать ещё 9 комментариев
239

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

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

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

  • 0
    Немного больше информации здесь: blueonionsoftware.com/…
  • 14
    это исправило мою проблему, работало в chrome и firefox, но не в IE. добавил это в начало моего сценария, и все было хорошо
Показать ещё 16 комментариев
26

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

<!--[if lte IE 9]>
<script type='text/javascript' src='/jquery.xdomainrequest.min.js'></script>
<![endif]-->

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

7

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

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

6

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

  • 1
    К вашему сведению, это действительно не сработает для исходного запроса автора, поскольку jsonp не поддерживает глагол POST, только GET.
  • 0
    вы правы, я использовал его для получения каналов fbwall, google + и т. д., используя ajax
Показать ещё 2 комментария
0

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

Для этого я добавил 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

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

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

After: /_vti_bin/service.svc
  • 0
    Что ты попробовал? Вызов ajax с той же машины, где расположен браузер ....
  • 1
    Да, jQuery ajax запрос того же домена, если домен не указан в URL. В моем случае мне не нужно было делать межсайтовый запрос, и кажется, что наличие домена в параметре url запроса ajax заставило запрос как-то вести себя как межсайтовый. Моя среда использует Microsoft ForeFront с некоторыми правилами перенаправления, и вполне возможно, что это может быть причиной проблем.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню