Cuộc gọi jQuery đến WebService trả về Lỗi Không có lỗi Giao thông


163

Tôi có dịch vụ web sau đây;

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

Đó là tiêu chuẩn chứng khoán không có thay đổi đối với các nhà trang trí lớp.

Tôi có phương pháp jQuery này;

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);
          }
});

Đó là một hành động bài viết vì sau này tôi cần đăng dữ liệu lên nó.

Khi tôi thực thi jQuery, tôi nhận được lỗi "Không vận chuyển".

Một điều tôi cũng nên đề cập là jQuery được lưu trữ trong một tệp HTML đơn giản trên máy của tôi và WebService cũng đang chạy trên máy của tôi.

Không có mã phía sau trên trang HTML, nó chỉ đơn giản là một trang web và không phải là dự án ac # hay bất cứ thứ gì.

Bất cứ ai có thể xin vui lòng chỉ cho tôi đi đúng hướng ở đây?


Bạn có thể truy cập dịch vụ web của mình chỉ bằng trình duyệt không?
Avitus

Xin lỗi, tôi không nhận thấy rằng đây là một bài viết khác (tôi đã chỉnh sửa bài đăng này, nghĩ rằng đó là bài viết của riêng tôi), tôi phải nhấp vào siêu liên kết đến bài đăng này trong bài đăng của riêng tôi. Thực sự xin lỗi chủ sở hữu bài đăng = \
Erick Garcia

$ .support.cors = đúng; Nếu điểm cuối của bạn được bật CORS (nó phản hồi chính xác với tiêu đề Access-Control-Allow-Origin, v.v.), thì dòng mã này sẽ thuyết phục jQuery thực hiện yêu cầu xuất xứ chéo trong IE8. Tôi chỉ chạy vào đây sớm hơn, hy vọng nó sẽ giúp bạn tiết kiệm thời gian và đau đầu.
Jeremy Hert

Câu trả lời:


95

Nếu trang jQuery của bạn không được tải từ http://localhost:54473đó thì vấn đề này có thể là do bạn đang cố gắng thực hiện yêu cầu tên miền chéo.

Cập nhật 1 Hãy xem bài viết trên blog này .

Cập nhật 2 Nếu đây thực sự là vấn đề (và tôi nghi ngờ đó là), bạn có thể muốn xem JSONP như một giải pháp. Dưới đây là một vài liên kết có thể giúp bạn bắt đầu:


4
Vâng, nó có thể có liên quan đến bảo mật.
thenengah

3
Nó không phải là localhost: 54473, nó chỉ phải là cùng một tên miền.
jcolebrand

7
@drachenstern Hừm, tôi đã luôn nghĩ (và dường như luôn nhớ luôn đọc) rằng sơ đồ, máy chủ cổng cần phải giống nhau. Điều nàyđiều nàyđiều này dường như hỗ trợ cách suy nghĩ của tôi về những gì tạo thành cùng một miền.
no.good.at.coding

@drachenstern Rất vui khi được giúp đỡ! Tất cả các công cụ web này là khó khăn - một cái gì đó mới để tìm hiểu hàng ngày :)
no.good.at.coding

1
@grieks Rất tốt để nghe nhưng lưu ý rằng bạn không thực sự giải quyết vấn đề - điều này sẽ chỉ hoạt động nếu môi trường cho phép các yêu cầu tên miền chéo vì bạn chỉ gỡ bỏ các trình bảo vệ an toàn mà jQuery đặt. Nếu trình duyệt của bạn không cho phép, thiết lập thuộc tính này sẽ không làm gì cho bạn. Tôi khuyên bạn nên bỏ một chút nỗ lực ngay bây giờ để có được JSONP. Ít nhất, bạn có thể muốn thử và xem liệu việc buộc hỗ trợ tên miền chéo jQuery có hoạt động với tất cả các trình duyệt mà bạn dự định hỗ trợ hay không. Tôi cũng không thể nhận xét về những vấn đề khác mà bạn có thể gặp phải sau này!
no.good.at.coding

253

Thêm điều này: jQuery.support.cors = true;

Nó cho phép tạo kịch bản chéo trang trong jQuery (được giới thiệu sau 1,4 lần, tôi tin thế).

Chúng tôi đã sử dụng một phiên bản jQuery thực sự cũ (1.3.2) và hoán đổi nó cho 1.6.1. Mọi thứ đều hoạt động, ngoại trừ các cuộc gọi .ajax (). Thêm dòng trên đã khắc phục vấn đề.


Thêm một chút thông tin ở đây: blueonionsoftware.com/ từ
Andrew Arnott

14
Điều này khắc phục sự cố của tôi, đã làm việc trong chrome và firefox nhưng không phải IE. đã thêm phần này vào đầu kịch bản của tôi và tất cả đều tốt
Peter

@SrBlanco Điều này cũng sửa lỗi thử nghiệm của tôi, Cảm ơn bạn đã chia sẻ thông tin này.
dev

4
Khắc phục rất tốt, tôi gặp vấn đề tương tự trên Internet Explorer 9 khi tôi yêu cầu tệp kml từ cùng một tên miền bằng cách sử dụng đường dẫn tương đối ... bí ẩn của IE ...
Matteo Conta

cảm ơn. vâng, các cuộc gọi còn lại của tôi đã dừng sau khi cập nhật 1.5 jquery. mã này đã sửa nó.
ashraf

26

Tôi đã có cùng một lỗi trên một trang và tôi đã thêm những dòng này:

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

và cuối cùng nó hoạt động với tôi;) không còn lỗi trong IE9.


6
Dự án Github: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest và XDomainRequest thông tin: blog.msdn.com/b/ieiternals/archive/2010/05/13/ . Về cơ bản, IE8 và IE9 không hỗ trợ CORS trên đối tượng XMLHttpRequest. Thay vào đó, bạn buộc phải sử dụng đối tượng XDomainRequest (hạn chế hơn. Có thể đọc thông tin trên liên kết thứ hai).
richardaday

7

Không có câu trả lời đề xuất nào hoàn toàn làm việc cho tôi. Trường hợp sử dụng của tôi hơi khác một chút (thực hiện ajax lấy tệp S3 .json trong IE9). Cài đặt jQuery.support.cors = true;đã thoát khỏi No Transportlỗi nhưng tôi vẫn nhận được Permission deniedlỗi.

Điều làm việc với tôi là sử dụng jQuery-ajaxTransport-XDomainRequest để buộc IE9 sử dụng XDomainRequest. Sử dụng này không yêu cầu thiết lậpjQuery.support.cors = true;


6

tôi giải quyết nó bằng cách sử dụng dataType = 'jsonp' tại vị trí của dataType = 'json'


2
FYI, điều đó thực sự không hoạt động cho yêu cầu của người đăng ban đầu vì jsonp không hỗ trợ động từ POST, chỉ NHẬN.
Daniel Cox

ya bạn đúng, tôi đã sử dụng nó để nhận nguồn cấp dữ liệu của fbwall, google + vv bằng cách sử dụng ajax
Abhishek

Tôi vẫn sẽ cung cấp +1 vì nó giúp ích cho việc sử dụng của tôi, Cảm ơn.
Manatherin

0

Tôi cũng gặp phải vấn đề này và tất cả các giải pháp được đưa ra ở trên đều thất bại hoặc không thể áp dụng được do các hạn chế dịch vụ web của khách hàng.

Đối với điều này, tôi đã thêm một iframe trong trang của mình nằm trong máy chủ của máy khách. Vì vậy, khi chúng tôi đăng dữ liệu của mình lên iframe và iframe sau đó đăng nó lên dịch vụ web. Do đó tham chiếu tên miền chéo được loại bỏ.

Chúng tôi đã thêm kiểm tra nguồn gốc 2 chiều để chỉ xác nhận dữ liệu trang được ủy quyền gửi đến và từ iframe.

Hy vọng nó giúp

<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

Đối với tôi đó là một câu chuyện hoàn toàn khác.
Vì trang này có thứ hạng công cụ tìm kiếm tốt, tôi nên thêm trường hợp của mình và giải pháp ở đây nữa.

Tôi jquerytự xây dựng với webpackviệc chỉ chọn các mô-đun tôi sử dụng. Các ajax luôn luôn thất bại với thông báo "Không vận chuyển" là đầu mối duy nhất.

Sau một thời gian dài gỡ lỗi, vấn đề hóa ra XMLHttpRequestlà có thể cắm được jqueryvà nó không bao gồm theo mặc định.

Bạn phải bao gồm rõ ràng jquery/src/ajax/xhrtệp để làm cho ajax hoạt động trong trình duyệt.


-1

Tôi đã giải quyết nó đơn giản bằng cách xóa tên miền khỏi url yêu cầu.

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

After: /_vti_bin/service.svc

1
Có, yêu cầu ajax cùng tên miền jQuery trong đó tên miền không được chỉ định trong url. Trong trường hợp của tôi, tôi không cần phải thực hiện một yêu cầu nhiều trang web và dường như việc có tên miền trong tham số url của yêu cầu ajax đã khiến yêu cầu bằng cách nào đó hành xử chéo trang web. Môi trường của tôi sử dụng Microsoft ForeFront với một số quy tắc chuyển hướng và có thể nó có thể gây ra sự cố.
Draghon

vậy thì tại sao bạn lại trả lời trong câu hỏi liên quan đến yêu cầu ajax tên miền chéo
Naeem Shaikh

1
@ NaeemShaikh27, bản chất của yêu cầu (tên miền chéo so với cùng tên miền) không rõ ràng từ OP; Tôi đã giải quyết câu hỏi đưa ra các tham số "rõ ràng" trong câu hỏi. Bất kể, tôi chỉ nói "này, tôi cũng mắc lỗi tương tự, đây là những gì tôi đã làm" và dù bạn có thích hay không (hoặc liệu nó có phù hợp với SO) hay không, nó đã làm việc với tôi. Bây giờ, nếu bạn quay lại và làm cho câu hỏi cụ thể hơn, thì câu trả lời của tôi sẽ hoàn toàn không liên quan.
Draghon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.