jQuery Дзвінок на 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 # або щось інше.

Чи може хтось, будь ласка, вказати мене в правильному напрямку тут?


Чи можете ви перейти до свого веб-сервісу лише за допомогою браузера?
Авітус

Вибачте, я не помітив, що це інша публікація (я редагував цю публікацію, думаючи, що це моя власна), я, мабуть, натиснув гіперпосилання на це у своєму власному дописі. Дуже шкода власнику допису = \
Ерік Гарсія

$ .support.cors = true; Якщо ваша кінцева точка увімкнена CORS (вона відповідає правильно заголовом Access-Control-Allow-Origin тощо), цей рядок коду переконує jQuery зробити запит перехресного походження в IE8. Я просто наткнувся на це раніше, сподіваючись, що це врятує деяких із вас час і головний біль.
Джеремі Герт

Відповіді:


95

Якщо ваша сторінка jQuery не завантажується звідти, http://localhost:54473ця проблема, мабуть, тому, що ви намагаєтеся зробити запит між доменами.

Оновлення 1 Подивіться на цю публікацію в блозі .

Оновлення 2 Якщо це справді проблема (і я підозрюю, що вона є), ви можете перевірити JSONP як рішення. Ось кілька посилань, які можуть допомогти вам почати:


4
Так, це, мабуть, має відношення до безпеки.
thenengah

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 (). Додавання вищевказаного рядка вирішило проблему.


Трохи більше інформації тут: 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 помилок.


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;


6

я вирішую це за допомогою dataType = 'jsonp' у місці dataType = 'json'


2
FYI, це дійсно не працювало б на запит оригіналу, оскільки jsonp не підтримує дієслов POST, тільки GET.
Даніель Кокс

Так, я використовував його для отримання каналів fbwall, google + тощо за допомогою ajax
Abhishek

Я все ще збираюся дати +1, тому що це допомогло для мого використання, Дякую.
Манатерин

0

Я теж отримав цю проблему, і всі рішення, наведені вище, або не вдалося, або не були застосовні через обмеження веб-сервісу клієнта.

Для цього я додав на свою сторінку iframe, який проживав на сервері client; s. Отже, коли ми розміщуємо наші дані в 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

1
Так, jQuery запит ajax того ж домену jQuery, коли домен не вказаний в URL-адресі. У моєму випадку мені не потрібно було робити запит між веб-сайтом, і, здається, що наявність домену в параметрі url запиту ajax зробила запит якось поводитись cross-site'ish. Моє середовище використовує Microsoft ForeFront з деякими правилами переадресації, і можливо, це може спричинити проблеми.
Драгон

то чому ви відповідаєте на запитання щодо міждоменного запиту на ajax
Naeem Shaikh

1
@ NaeemShaikh27, характер запиту (міждоменний і той самий домен) не був зрозумілий з ОП; Я звертався до питання з урахуванням "очевидних" параметрів у питанні. Незважаючи на те, я просто кажу "ей, я отримав таку ж помилку, ось що я зробив" і вам це подобається чи ні (чи підходить це для SO), це спрацювало для мене. Тепер, якщо ви повернетесь і зробите питання більш конкретним, то моя відповідь буде абсолютно нерелевантною.
Драгон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.