Các yêu cầu jQuery Ajax đang bị hủy mà không được gửi đi


87

Tôi đang cố gắng kết nối một tập lệnh với ứng dụng World-Wide Telescope của Microsoft. Cái sau sẽ lắng nghe các lệnh trên cổng 5050. Nó đang chạy trên cùng một máy với trình duyệt (Chrome hiện tại, nhưng theo như tôi có thể nói thì hoạt động giống như Firefox 7 và IE 9).

Tôi đang gửi tiêu đề "Access-Control-Allow-Origin: *" cùng với tệp html gốc để cố gắng loại bỏ các hạn chế XSS là vấn đề của tôi.

Mã của tôi để truy cập WWT như sau:

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    crossDomain: true,
    success: success,
    dataType: dataType
});

url trong trường hợp này là "http: //127.0.0.1: 5050 / layerApi.aspx? cmd = new & ..." (rõ ràng ... ở đây viết tắt cho một số tham số bổ sung).

Nhìn vào chẩn đoán mạng trong Chrome, tôi có thể thấy điều này:

Request URL:http://127.0.0.1:5050/layerApi.aspx?cmd=new&...
Request Headersview source
Accept:application/xml, text/xml, */*; q=0.01
Content-Type:application/x-www-form-urlencoded
Origin:http://gwheeler4
Referer:http://gwheeler4/conceptconnect.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1

Yêu cầu được đưa ra - tôi thấy WWT tạo một lớp mới. Tuy nhiên, tôi không nhận được cuộc gọi lại. Nếu tôi thêm một lệnh gọi lại lỗi được gọi, nhưng thuộc tính lỗi trên đối tượng jqXHR chỉ là "lỗi" và trạng thái là 0. Nếu tôi nhìn vào yêu cầu mạng trong Chrome, tôi thấy trạng thái "(đã hủy)" và không có phản hồi .

Nếu tôi lấy cùng một URL đó và dán nó vào một tab trình duyệt mới, tôi có thể thấy rằng phản hồi là XML mong đợi.

Tất nhiên, một sự khác biệt ở đây là đây là GET không phải là ĐĂNG, nhưng tôi đã thử điều đó trong tập lệnh của mình và nó không có gì khác biệt.

Tôi khá bối rối vì điều này và sẽ đánh giá cao bất kỳ ý tưởng mới nào.


Bạn đã thử xử lý lệnh errorgọi lại để xem nó có bị lỗi không?
StriplingWarrior

1
"Tôi đang gửi tiêu đề" Access-Control-Allow-Origin: * "với tệp html gốc để cố gắng loại bỏ các hạn chế XSS là vấn đề của tôi." Ý của bạn là máy chủ đang gửi lại tiêu đề Access-Control-Origin? Hay bạn đang gửi nó cùng với yêu cầu Ajax?
Jason Dean

hãy thử truy cập trang trực tiếp thông qua url và xem bạn có nhận được bất kỳ điều gì không
zod

1
Có, tôi gặp lỗi gọi lại với văn bản trạng thái "" và mã 0. Đây không phải là vấn đề jQuery; Tôi đã viết lại mã bằng cách sử dụng một XHR thẳng và tôi nhận được kết quả tương tự - tức là readyState là 4 với request.status bằng 0 và request.responseText trống. Tiêu đề Access-Control-Allow-Origin đang được gửi bởi máy chủ. Việc truy cập trang trực tiếp thông qua URL sẽ trả về phản hồi XML mong đợi.
Graham Wheeler

Câu trả lời:


134

Nếu bất kỳ ai khác gặp phải vấn đề này, chúng tôi gặp phải vấn đề là chúng tôi đang thực hiện yêu cầu ajax từ một liên kết và không ngăn liên kết được theo dõi. Vì vậy, nếu bạn đang thực hiện điều này trong một onclickthuộc tính, hãy đảm bảo điều này return false;.


Điều này cũng làm việc cho tôi. Cảm ơn. Tôi quên mất lý do tại sao tôi lại trả về false trong trình xử lý onClick của mình và đã thay đổi nó thành true, và sau khi đọc bài đăng của bạn, tôi chợt nhận ra điều đó.
Shiprack 21/10/12

4
Ngoài ra, nếu bạn đang sử dụng một biểu mẫu, bạn cần thêm thuộc tính return falseở cuối của bạn onsubmit.
Jason Axelson

8
@VincentClyde "return false;"cho biết các biểu mẫu và liên kết để hủy bỏ hành động. Điều này ban đầu nhằm mục đích xác thực biểu mẫu javascript, trong đó hàm xác thực sẽ trả về false nếu biểu mẫu không hợp lệ, ngăn biểu mẫu gửi.
Tyzoid

13
Bạn cũng có thể sử dụng e.preventDefault();, nơi eonclicktham số sự kiện.
Hannele

1
@Hannele Cảm ơn bạn rất nhiều vì đã chia sẻ event.preventDefault. Tôi cần nó rất nhiều. Tôi không thấy câu trả lời nào khác gợi ý điều này. Bạn nên đăng điều này như câu trả lời riêng biệt.
Mohit

112

Nếu đang sử dụng Chrome, bạn không thể thấy đủ thông tin trong bảng điều khiển mạng Chrome tiêu chuẩn để xác định nguyên nhân gốc rễ của (canceled)yêu cầu.

Bạn cần sử dụng chrome://net-internals/#eventsnó sẽ hiển thị cho bạn thông tin chi tiết về yêu cầu bạn đang gửi - bao gồm chuyển hướng ẩn / thông tin bảo mật về cookie được gửi, v.v.

ví dụ: phần sau cho thấy một chuyển hướng mà tôi không nhìn thấy trong theo dõi mạng - do cookie của tôi không được gửi qua miền phụ:

t=1374052796448 [st=  1]   +URL_REQUEST_START_JOB  [dt=261]
                            --> load_flags = 143540481 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VALIDATE_CACHE | VERIFY_EV_CERT)
                            --> method = "GET"
                            --> priority = 2
                            --> url = "https://...."
...
t=1374052796708 [st=261]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                                --> HTTP/1.1 302 Moved Temporarily
                                    Content-Type: text/html
                                    Date: Wed, 17 Jul 2013 09:19:56 GMT
...
t=1374052796709 [st=262]     +URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=0]
t=1374052796709 [st=262]        CANCELLED
t=1374052796709 [st=262]   -URL_REQUEST_START_JOB
                            --> net_error = -3 (ERR_ABORTED)

Tôi cũng có một vấn đề (bị hủy). @Ben, thật tuyệt khi tìm hiểu về dấu vết này, tiếc là nó không cung cấp bất kỳ thông tin nào. Máy chủ trong trường hợp của tôi là S3 và cors được định cấu hình trên thùng của tôi. Tất cả những gì tôi đang làm là GET đơn giản cho một hình ảnh. Tôi thấy trong bảng điều khiển mạng một yêu cầu có tiêu đề Nguồn gốc, nhưng không có phản hồi. Rõ ràng Chrome sẽ hủy yêu cầu trước khi gửi nó đến máy chủ. Không có chuyển hướng, không có https, không có nội dung-chiều dài 0. Đập đầu vào đầu tôi cả ngày, vẫn là một bí ẩn.
Gene Vayngrib,

@GeneVayngrib Hãy thử Firefox - trình gỡ lỗi mạng sẽ trực tiếp hiển thị thêm thông tin - bạn có thể giải quyết vấn đề ở đó và sau đó làm cho nó hoạt động trong Chrome.
Ben Walding

@BenW cảm ơn bạn, nhưng Firefox không gặp vấn đề gì với hình ảnh được cung cấp từ Amazon S3 này.
Gene Vayngrib, 19/09/13

YUPP. Điều đó đã giúp rất nhiều!
rubmz

21

Trong trường hợp của tôi, tôi đã gặp phải type='submit'như vậy khi tôi gửi biểu mẫu, trang đang tải lại trước khi cú đánh ajax xảy ra, vì vậy một giải pháp đơn giản là phải có type="button". Nếu bạn không chỉ định loại thì submittheo mặc định, vì vậy bạn phải chỉ địnhtype="button"

type='submit' => type='button'

HOẶC LÀ

Không có loại => type='button'


3
gửi bài trên đây, kiện tôi stackoverflow. Tôi đã tìm kiếm cao và thấp cả ngày cho lý do tại sao yêu cầu của tôi hoạt động từ bảng điều khiển nhưng không phải là tập lệnh, và đây là câu trả lời .. cảm ơn bạn !!!
pcort

1
Tôi đã đăng nhập và tìm lại chủ đề này để ủng hộ câu trả lời này !!, điều này đã giúp ích rất nhiều. tôi đã gục đầu trong nhiều giờ
dev

Jai shree krishna, hy vọng nó sẽ giúp nhiều người đến. Và họ đã tìm ra sớm hơn.
Black Mamba

6

Tôi đã có một vấn đề tương tự. Trong trường hợp của tôi, tôi đang cố gắng sử dụng dịch vụ web trên máy chủ apache + django (dịch vụ do chính tôi viết). Tôi đã gặp cùng một đầu ra như bạn: Chrome nói rằng nó đã bị hủy trong khi FF thì không sao. Nếu tôi cố gắng truy cập dịch vụ trực tiếp trên trình duyệt thay vì ajax, nó cũng sẽ hoạt động. Tìm kiếm xung quanh, tôi phát hiện ra rằng một số phiên bản apache mới hơn không đặt độ dài của phản hồi một cách chính xác trong tiêu đề phản hồi, vì vậy tôi đã thực hiện việc này theo cách thủ công. Với django, tất cả những gì tôi phải làm là:

response['Content-Length'] = len(content)

Nếu bạn có quyền kiểm soát dịch vụ bạn đang cố gắng truy cập, hãy tìm hiểu cách sửa đổi tiêu đề phản hồi trong nền tảng bạn đang sử dụng, nếu không bạn phải liên hệ với nhà cung cấp dịch vụ để khắc phục sự cố này. Rõ ràng, FF và nhiều trình duyệt khác có thể xử lý tình huống này một cách chính xác, nhưng các nhà thiết kế Chrome đã quyết định làm điều đó theo quy định.


Tôi đã thử đặt tiêu đề có độ dài nội dung và vẫn gặp sự cố như được mô tả trong câu hỏi ban đầu. Tôi đang sử dụng PHP 5.3.8 và Apache 2.2.21 (sử dụng WAMP trong Windows 7)
rodrigo-silveira

4

Tôi đã có một vấn đề tương tự. Sử dụng chrome: // net-internals / # event, tôi có thể thấy rằng sự cố của tôi là do một số chuyển hướng im lặng. Yêu cầu nhận của tôi đã được kích hoạt trong một tập lệnh tải lên. Url có dạng " http://example.com/inner-path " và đường dẫn 301 vĩnh viễn chuyển hướng đến "/ inner-path". Để khắc phục sự cố, tôi chỉ cần thay đổi url thành "/ inner-path" và điều đó đã khắc phục sự cố. Tôi vẫn không biết tại sao một tập lệnh đã hoạt động cách đây một tuần đột nhiên đưa ra vấn đề cho tôi ... Hy vọng điều này sẽ giúp ai đó


3

(Sử dụng Biểu mẫu Web ASP.NET)

Vấn đề của tôi là tôi đang cố gắng kích hoạt Ajax khỏi sự kiện nhấp chuột của nút gửi có thiết lập sự kiện nhấp chuột phía máy chủ. Tôi phải làm cho nút chỉ là một nút đơn giản (tức là <input type="button">)


Cảm ơn rât nhiều.
Farheen Nilofer

3

Tôi đã gặp vấn đề tương tự, đối với tôi, tôi đang tạo iframe tạm thời và tôi đang xóa iframe trước khi ajax hoàn tất, vì vậy trình duyệt sẽ hủy yêu cầu ajax của tôi.


Bạn đã giải quyết vấn đề này như thế nào? Trang web của tôi đang được nhúng vào một iFrame không do tôi kiểm soát. Tôi muốn cuộc gọi của mình được hoàn tất vì nó thực hiện một số cài đặt dữ liệu nền
Rips

@Rips đây là 4 năm trước, dù sao thì tôi nghĩ tôi đã giải quyết nó bằng cách sử dụng Promises
Reza

3

Mở rộng câu trả lời của @ Kazetsukai, bạn có thể gặp sự cố này nếu bạn đang thực hiện yêu cầu AJAX của mình từ người dùng nhấp vào liên kết.

Nếu bạn thiết lập liên kết của mình như vậy:

<a href="#" onclick="soAjax()">click me!</a>

Và sau đó là một trình xử lý javascript như sau:

soAjax() {
    $.ajax({ ... all your lovely parameters ... });       
}

Để ngăn trình duyệt của bạn theo liên kết và hủy bất kỳ yêu cầu nào đang diễn ra, bạn nên thêm return falsehoặc e.preventDefault()để ngăn sự kiện nhấp chuột lan truyền:

soAjax() {
   $.ajax({ ... etc ... });
   return false;
}

Hoặc là:

soAjax(e) {
   $.ajax({ ... etc ... });
   e.preventDefault();
}

2

Có hai khả năng xảy ra khi yêu cầu AJAX bị bỏ (nếu không phải là yêu cầu Cross-Origin):

  1. Bạn không ngăn chặn hành vi mặc định của phần tử cho sự kiện.
  2. Bạn đặt thời gian chờ của AJAX quá thấp hoặc máy chủ phụ trợ của mạng / ứng dụng chậm.

Giải pháp cho 1) : Thêm return false;hoặc e.preventDefault();trong trình xử lý sự kiện.

Giải pháp cho 2) : Thêm tùy chọn thời gian chờ trong khi hình thành yêu cầu AJAX. Ví dụ bên dưới.

$.ajax({
    type: 'POST',
    url: url,
    timeout: 86400,
    data: data,
    success: success,
    dataType: dataType
});

Đối với các yêu cầu nguồn gốc chéo, hãy kiểm tra tiêu đề HTTP Chia sẻ tài nguyên nhiều nguồn gốc (CORS).


1

Tôi gặp lỗi này khi thực hiện yêu cầu sử dụng http tới url yêu cầu https. Tôi đoán cuộc gọi ajax không xử lý chuyển hướng. Đây là trường hợp ngay cả với tùy chọn ajax crossDomain được đặt thành true (trên JQuery 1.5.2).


0

Trong trường hợp của tôi, tôi viết lại mod của Apache khớp với url và chuyển hướng yêu cầu đến https.

Xem xét yêu cầu trong sự kiện chrome: // net-internals / #.

Nó sẽ hiển thị nhật ký nội bộ của yêu cầu. Kiểm tra chuyển hướng.


0

Tôi đã gặp vấn đề tương tự, nhưng trong trường hợp của tôi, hóa ra là vấn đề cookie. Những người làm việc trên back-end đã thay đổi đường dẫn của cookie JSESSIONID được đặt khi chúng tôi đăng nhập vào ứng dụng của mình và tôi có một cookie cũ có tên đó trên máy tính của mình, nhưng với đường dẫn cũ. Vì vậy, khi tôi thử đăng nhập vào trình duyệt (Chrome) đã gửi hai cookie có tên là JSESSIONID, với các giá trị khác nhau, đến máy chủ - điều này có thể hiểu nhầm - vì vậy nó đã hủy yêu cầu. Xóa cookie khỏi máy tính của tôi đã sửa nó.


0

Tôi đã gặp lỗi này theo một cách kỳ lạ hơn: Tab mạng và các sự kiện chrome: // net-internals / # không hiển thị yêu cầu sau khi hoàn tất js. Khi tạm dừng js trong lỗi callcack tab mạng đã hiển thị yêu cầu là (bị hủy). Liên tục được gọi cho chính xác một (luôn luôn giống nhau) của một số yêu cầu tương tự trong một trang web. Sau khi khởi động lại Chrome, lỗi không xuất hiện nữa!


0

Tôi đã hủy trong Firefox . Một số cuộc gọi ajax hoạt động hoàn toàn tốt đối với tôi, nhưng nó không thành công đối với đồng nghiệp thực sự phải sử dụng nó.

Khi tôi kiểm tra điều này thông qua các thủ thuật Chrome được đề cập ở trên, tôi không tìm thấy gì đáng ngờ. Khi kiểm tra nó trong firebug, nó hiển thị hoạt ảnh 'đang tải' sau hai lần gọi kim loại và không có tab kết quả.

Giải pháp rất đơn giản: truy cập lịch sử, tìm trang web, nhấp chuột phải -> quên trang web.
Quên, không xóa.

Sau đó, không có vấn đề gì nữa. Tôi đoán là nó có liên quan gì đó với .htaccess.


0

Trong trường hợp của tôi, đó là dấu gạch chéo bị thiếu trong url. Thêm dấu gạch chéo sau giải quyết vấn đề của tôi.


0

Đối với trường hợp Dropzone.js. Trong trường hợp của tôi, nguyên nhân là do giá trị timeouttùy chọn quá thấp theo mặc định. Vì vậy, hãy tăng nó theo nhu cầu của bạn.

{
// other dropzone options
timeout: 60000 * 10, // 10 minutes
...
}

-1

Tôi gặp sự cố này với một mạng 3G cụ thể.
Nó sẽ luôn không thành công với các yêu cầu DELETE với net_error = -101sự kiện chrome: // net-internals / #.

Các mạng khác hoạt động tốt nên tôi cho rằng có một máy chủ proxy bị lỗi hoặc một cái gì đó.

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.