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

163

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

    [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 # или что-то еще.

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

griegs
источник
Можете ли вы получить доступ к своему веб-сервису только с помощью браузера?
Авитус
Извините, я не заметил, что это другой пост (я редактировал этот пост, думая, что он мой), я, должно быть, нажал на гиперссылку на этот пост в своем посте. Действительно извините владельца сообщения = \
Эрик Гарсия
$ .support.cors = true; Если ваша конечная точка включена CORS (она правильно отвечает заголовком Access-Control-Allow-Origin и т. Д.), То эта строка кода убедит jQuery выполнить перекрестный запрос источника в IE8. Я только что столкнулся с этим ранее, надеясь, что это сэкономит некоторым из вас время и головную боль.
Джереми Херт

Ответы:

95

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

Обновление 1 Посмотрите на это сообщение в блоге .

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

no.good.at.coding
источник
4
Да, это, вероятно, связано с безопасностью.
тогдашний день
3
Это не должно быть localhost: 54473, это просто должен быть тот же домен.
Jcolebrand
7
@ Drachenstern Хм, я всегда думал (и, кажется, всегда помнил, что читал), что схема, хост и порт должны быть одинаковыми. Это, и это, и это, кажется, поддерживают мой образ мышления о том, что составляет одну и ту же область.
no.good.at.coding
@ Drachenstern Рад быть полезным! Весь этот веб-материал хитрый - что-то новое, чтобы учиться каждый день :)
no.good.at.coding
1
@griegs Приятно слышать, но обратите внимание, что вы на самом деле не решаете проблему - это будет работать только в том случае, если среда разрешает междоменные запросы, поскольку вы удаляете только те средства защиты, которые устанавливает jQuery. Если ваш браузер не позволяет это сделать, настройка этого свойства ничего не сделает для вас. Я бы порекомендовал приложить немного усилий сейчас, чтобы установить JSONP. По крайней мере, вы можете попробовать проверить, работает ли принудительная междоменная поддержка jQuery со всеми браузерами, которые вы планируете поддерживать. Я также не могу комментировать, с какими другими проблемами вы можете столкнуться позже!
no.good.at.coding
253

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

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

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

SrBlanco
источник
Немного больше информации здесь: blueonionsoftware.com/…
Эндрю Арнотт
14
это решило мою проблему, работало в chrome и firefox, но не в IE. добавил это в начало моего сценария, и все было хорошо
Питер
@SrBlanco Это исправило и мою проблему, спасибо, что поделились этой информацией.
Дев
4
Очень хорошее исправление, у меня была такая же проблема в Internet Explorer 9, когда я запрашивал файл kml из того же домена, используя относительный путь ... тайны IE ...
Matteo Conta
Спасибо. да, мои остальные звонки прекратились после 1,5 обновлений jquery. этот код исправил это.
ашраф
26

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

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

bsuttor
источник
6
Проект Github: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest и информация XDomainRequest : blogs.msdn.com/b/ieinternals/archive/2010/05/13/… . По сути, IE8 и IE9 не поддерживают CORS для объекта XMLHttpRequest. Вместо этого вы вынуждены использовать объект XDomainRequest (который более ограничен. Можете прочитать информацию по второй ссылке).
Richardaday
7

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

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

rynop
источник
6

я решаю это с помощью dataType = 'jsonp' вместо dataType = 'json'

Абхишек
источник
2
К вашему сведению, это действительно не сработает для исходного запроса автора, поскольку jsonp не поддерживает глагол POST, только GET.
Даниэль Кокс
вы правы, я использовал его для получения каналов fbwall, google + и т. д. с помощью ajax
Abhishek
Я все еще собираюсь дать +1, потому что это помогло для моего использования, спасибо.
Манатерин
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

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

Я построил jqueryсебя, webpackвыбирая только те модули, которые я использую. Ajax всегда терпит неудачу с сообщением «Нет транспорта» в качестве единственной подсказки.

После долгой отладки проблема оказывается XMLHttpRequest подключаемой jqueryи не включается по умолчанию.

Вы должны явно включить jquery/src/ajax/xhrфайл, чтобы Ajax работал в браузерах.

Любопытный Сэм
источник
-1

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

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

After: /_vti_bin/service.svc
Draghon
источник
1
Да, jQuery ajax запрос того же домена, где домен не указан в URL. В моем случае мне не нужно было делать межсайтовый запрос, и кажется, что наличие домена в параметре url запроса ajax заставило запрос как-то вести себя как межсайтовый. Моя среда использует Microsoft ForeFront с некоторыми правилами перенаправления, и вполне возможно, что это может быть причиной проблем.
Драгон
тогда почему вы отвечаете на вопрос, касающийся междоменного запроса ajax
Наим Шейх
1
@ NaeemShaikh27, характер запроса (междоменный по сравнению с тем же доменом) не был ясен из OP; Я рассматривал вопрос, учитывая «очевидные» параметры в вопросе. Несмотря на это, я просто говорю «эй, я получил ту же ошибку, вот что я сделал», и нравится вам это или нет (или подходит ли это для SO), это сработало для меня. Теперь, если вы вернетесь и сделаете вопрос более конкретным, мой ответ будет совершенно неуместным.
Драгон