2010-12-30 37 views
6

Tôi đang cố gắng tạo một yêu cầu ajax cho một WebService trả về dữ liệu cho một số tham số được chỉ định trong XML. Điều này dường như hoạt động tốt trong IE, nhưng Firefox không thể giải mã phản hồi. Tôi có thể xem phản hồi thành công trong Fiddler sau khi giải mã. Đây là mã:

$(function() { 
    $.ajax({ 
     type: "GET", 
     url: 'http:/localhost/webservice.asmx/GetTags?groupId=10', 
     contentType: "text/xml; charset=utf-8", 
     dataType: "xml", 
     success: function(response) { 
      $('#result').html('success',response); 
      $(response).find("string").each(function() { 
       $('#result').append($(this).text()); 
      }); 
     }, 
     error: function(response) { 
      $('#result').html('failure',response); 
     } 
    }); 

}); 

Có cách nào để xác định rằng phản hồi cần được giải mã không? Hoặc bất kỳ cách nào khác để làm cho nó hoạt động?

EDIT: @ Nikki9696 - nó không được mã hóa JSON khi dữ liệu được trả về trong XML.

@Oleg - XML ​​mẫu tôi có thể nhìn thấy trong trình duyệt nếu truy cập vào webservice thông qua một URL như sau:

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/"> 
    <string>tag 1</string> 
    <string>tag 2</string> 
    <string>tag 3</string> 
</ArrayOfString> 

Các cáy trong TextView trả và nhắn

"đáp ứng được mã hóa và có thể cần phải được giải mã trước khi kiểm tra. Nhấp vào đây để chuyển đổi. "

Khi được nhấp, nó sẽ hiển thị cùng một XML. Tôi tắt nén nội dung động trong IIS sau đó XML có thể nhìn thấy trong fiddler ngay lập tức, nhưng FF vẫn không thể đối phó, để các quy tắc ra nén.

Tôi đã chơi xung quanh với tập lệnh một chút, có vẻ như jQuery có thể mặc định hoặc đoán một số tham số, do đó, kiểu dữ liệu, chẳng hạn, không bắt buộc. Với những cài đặt này, tôi nhận được một thông báo thành công, tuy nhiên nó vẫn không biết phải làm gì với dữ liệu. Tôi đã thử thiết lập dataType thành "jsonp" như đề xuất trong một số chuỗi SS (không thể tìm thấy nó vào lúc này, sẽ liên kết nó khi tôi làm) và lỗi thay đổi thành missing ; before statement, tôi đoán vì nó không phải là đối tượng JSON, nhưng XML. Có cách nào để thiết lập webservice để trả về một JSON thay thế?

CHỈNH SỬA 2: Tôi đã cập nhật url để phản ánh những gì thực sự đã xảy ra. Xin lỗi tôi đã bỏ lỡ nó, khiến mọi người không thể phát hiện ra nó.

+0

Khi bạn nói "giải mã", ý của bạn là mã hóa JSON? – Nikki9696

+0

bạn có thể bao gồm dữ liệu xml mà bạn nhận được từ dịch vụ web trở lại và bạn thấy trong Fiddler không? – Oleg

Trả lời

2

Vì bạn sử dụng URL tương đối như '/webservice.asmx/GetTags?groupId=10' bạn không có vấn đề với tên miền khác. Dường như với tôi rằng bạn chỉ nên sửa chữa một mã JavaScript của bạn. Ví dụ: mã sau đây

$(function() { 
    $.ajax({ 
     type: "GET", 
     url: '/WebService1.asmx/GetTags', 
     contentType: "text/xml; charset=utf-8", 
     data: {groupId:10}, 
     success: function (response) { 
      $('#result').html('success:'); 
      $(response).find("string").each(function() { 
       $('#result').append('<br />'+$(this).text()); 
      }); 
     }, 
     error: function (response) { 
      $('#result').html('failure:<br />' + response.responseText); 
     } 
    }); 
}); 

hoạt động tốt trong Internet Explorer, Firefox và Google Chrome. Nếu bạn cần tôi có thể gửi URL, nơi bạn có thể tải về toàn bộ dự án làm việc Visual Studio 2010.

CẬP NHẬT: Để trở về JSON thay vì XML từ phương pháp web mà bạn có thể thay thế [ScriptMethod(UseHttpGet = true)] đến [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] thuộc tính (trong .NET 4.0 bạn có thể làm như vậy theo những cách khác nhau) và sửa đổi mã JavaScript vào

sau
$(function() { 
    $.ajax({ 
     type: "GET", 
     url: '/WebService1.asmx/GetTagsJson', 
     contentType: "application/json; charset=utf-8", 
     data: { groupId: 10 }, 
     //dataType: "xml", 
     success: function (response) { 
      $('#result').html('success:'); 
      $(response.d).each(function() { 
       $('#result').append('<br />' + this); 
      }); 
     }, 
     error: function (response) { 
      $('#result').html('failure:<br />' + response.responseText); 
     } 
    }); 
}); 
+0

Trên thực tế con đường không phải là tương đối, và đó là vấn đề. Tôi cắt ra hầu hết nó để đơn giản hóa ví dụ, và do đó làm cho nó không thể cho bất cứ ai để phát hiện. Tôi sẽ thay đổi nó để phản ánh điều này. – Shagglez

+0

@Shagglez: Đường dẫn URL từ câu hỏi của bạn '/webservice.asmx/GetTags?groupId=10' là tương đối. Hơn nữa, bạn đã sử dụng mã lệnh 'jQuery.html()' theo cách sai (xem http://api.jquery.com/html/): '$ ('# result'). Html ('success', response) ; '. Xem phiên bản cố định trong câu trả lời của tôi. – Oleg

+0

CẢM ƠN BẠN !!! Thay đổi kiểu dữ liệu thành kiểu nội dung được lưu trong ngày !!! – trgraglia

1

Câu trả lời ngắn gọn là: Tôi đã cố thực hiện cuộc gọi từ một miền khác với dịch vụ web của tôi.

Dưới đây là một số chi tiết: Trong Firebug nhìn vào tab XML Tôi nhận thấy rằng các lỗi trở lại là XML Parsing Error: no element found Location: moz-nullprincipal:{757cb587-20da-4d2f-bf80-e3b915a234d4} Line Number 1, Column 1:, vì vậy tôi đã tìm kiếm thông điệp cụ thể này và tình cờ một người nào đó có cùng một vấn đề http://forum.jquery.com/topic/jquery-ajax-and-xml-issues-no-element-found. Đây là phần giải quyết được sự cố của tôi:

Mặc dù không rõ ràng trong tài liệu, bạn không thể sử dụng cuộc gọi AJAX để tìm nạp dữ liệu từ các miền khác.

Nó xảy ra với tôi rằng lý do nó hoạt động trong IE là lần đầu tiên tôi hỏi tôi có cho phép thực hiện cuộc gọi không an toàn này không. gọi đến một miền khác. FF không bao giờ nhắc tôi về nó và có thể vô hiệu hóa cuộc gọi theo mặc định.

Làm cho tương thích miền chéo là một vấn đề cho một ngày khác, hiện tại, nó đang làm mọi thứ tôi cần.

Các vấn đề liên quan