jQuery Call to WebService ส่งคืนข้อผิดพลาด“ No Transport”


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 ฉันได้รับข้อผิดพลาด "No transport"

สิ่งหนึ่งที่ฉันควรพูดถึงก็คือ jQuery นั้นถูกเก็บไว้ในไฟล์ HTML อย่างง่ายบนเครื่องของฉันและ WebService ก็ยังทำงานบนเครื่องของฉันด้วย

ไม่มีโค้ดด้านหลังบนหน้า HTML เป็นเพียงหน้าเว็บและไม่ใช่โครงการ ac # หรืออะไรก็ตาม

ใครช่วยชี้ฉันในทิศทางที่ถูกต้องได้ไหม


คุณสามารถใช้บริการเว็บโดยใช้เบราว์เซอร์ได้หรือไม่?
Avitus

ขออภัยฉันไม่ได้สังเกตว่านี่เป็นโพสต์อื่น (ฉันแก้ไขโพสต์นี้โดยคิดว่าเป็นของตัวเอง) ฉันต้องคลิกไฮเปอร์ลิงก์ไปยังโพสต์นี้ในโพสต์ของตัวเอง ขอโทษจริงๆที่เจ้าของโพสต์ = \
Erick Garcia

$ .support.cors = จริง หากปลายทางของคุณเปิดใช้งาน CORS (ตอบสนองได้อย่างถูกต้องกับส่วนหัว Access-Control-Allow-Origin เป็นต้น) จากนั้นโค้ดบรรทัดนี้จะโน้มน้าวให้ jQuery ทำการร้องขอไขว้ต้นกำเนิดใน IE8 ฉันเพิ่งพบเจอสิ่งนี้ก่อนหน้านี้หวังว่ามันจะช่วยให้คุณประหยัดเวลาและปวดหัวบ้าง
Jeremy Hert

คำตอบ:


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 ทุกอย่างทำงานได้ยกเว้นการโทร. jax () การเพิ่มบรรทัดข้างต้นแก้ไขปัญหาได้


ข้อมูลเพิ่มเติมอีกเล็กน้อยที่นี่: blueonionsoftware.com/.com/
Andrew Arnott

14
แก้ไขปัญหาของฉันทำงานใน chrome และ firefox แต่ไม่ใช่ IE เพิ่มสิ่งนี้ลงในส่วนบนสุดของสคริปต์ของฉันและทุกอย่างก็ดี
Peter

@SrBlanco นี่แก้ไขปัญหาของฉันด้วยขอบคุณที่แบ่งปันข้อมูลนี้
dev

4
การแก้ไขที่ดีมากผมมีปัญหาเดียวกันบน Internet Explorer 9 เมื่อฉันถูกขอไฟล์ KML จากโดเมนเดียวกันโดยใช้เส้นทางสัมพันธ์ ... ความลึกลับของ IE ...
มัตเตโอ Conta

ขอบคุณ ใช่การโทรที่เหลือของฉันหยุดลงหลังจากอัปเดต jQuery 1.5 ครั้ง รหัสนี้แก้ไขได้
ashraf

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
Daniel Cox

ใช่แล้วฉันใช้เพื่อรับฟีดของ fbwall, google + etc โดยใช้ ajax
Abhishek

ฉันยังคงให้ +1 เพราะช่วยฉันได้ขอบคุณ
Manatherin

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เลือกเฉพาะโมดูลที่ฉันใช้ อาแจ็กซ์ล้มเหลวเสมอกับข้อความ "ไม่ขนส่ง" เป็นเบาะแสเท่านั้น

หลังจากการแก้จุดบกพร่องยาวปัญหาจะเปิดออกจะXMLHttpRequestอยู่ใน pluggablejqueryและจะไม่รวมอยู่ในค่าเริ่มต้น

คุณต้องรวมอย่างชัดเจน jquery/src/ajax/xhrไฟล์เพื่อให้ Ajax ทำงานในเบราว์เซอร์


-1

ฉันแก้ไขมันได้ง่ายๆโดยการลบโดเมนออกจาก URL คำขอ

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

After: /_vti_bin/service.svc

1
ใช่ jQuery ร้องขอ ajax ในโดเมนเดียวกันโดยที่ไม่ได้ระบุโดเมนใน URL ในกรณีของฉันฉันไม่ต้องการทำการร้องขอข้ามไซต์และดูเหมือนว่าการมีโดเมนในพารามิเตอร์ url ของคำขอ ajax ทำให้การร้องขอนั้นทำงานข้ามไซต์ สภาพแวดล้อมของฉันใช้ Microsoft ForeFront ด้วยกฎการเปลี่ยนเส้นทางบางอย่างและเป็นไปได้ว่าอาจเป็นสาเหตุของปัญหา
Draghon

ทำไมคุณตอบคำถามเกี่ยวกับคำขออา
แจ็กซ์

1
@ NaeemShaikh27 ลักษณะของคำขอ (ข้ามโดเมนกับโดเมนเดียวกัน) ไม่ชัดเจนจาก OP; ฉันกำลังตอบคำถามที่ระบุพารามิเตอร์ "ชัดเจน" ในคำถาม โดยไม่คำนึงว่าฉันแค่พูดว่า "เฮ้ฉันได้รับข้อผิดพลาดเดียวกันนี่คือสิ่งที่ฉันทำ" และไม่ว่าคุณจะชอบหรือไม่ (หรือว่ามันเหมาะสมสำหรับ SO) มันทำงานสำหรับฉัน ทีนี้ถ้าคุณย้อนกลับไปถามคำถามที่เฉพาะเจาะจงมากขึ้นคำตอบของฉันจะไม่เกี่ยวข้องอย่างสมบูรณ์
Draghon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.