2010-04-26 3 views
5

Tôi đang cố gắng gọi chức năng dịch vụ web thông qua phương thức GET bằng jQuery, nhưng gặp sự cố. Đây là một mã dịch vụ web:Gọi chức năng dịch vụ web ASP.NET thông qua phương thức GET với jQuery

[WebService(Namespace = "http://something.com/samples")] 
[ScriptService] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class TestWebService : System.Web.Services.WebService { 
    [WebMethod] 
    public string Test2() 
    { 
     string result = null; 

    try 
     { 
      result = "{'result':'success', 'datetime':'" + DateTime.Now.ToString() + "'"; 
     } 
     catch (Exception ex) 
     { 
      result = "Something wrong happened"; 
     } 

     return result; 
    } 

} 

Đó là cách tôi gọi hàm:

$.ajax({ type: "GET", 
     url: "http://localhost/testwebsite/TestWebService.asmx/Test2", 
     data: "{}", 
     contentType: "application/json", 
     dataType: "json", 
     error: function (xhr, status, error) { 
      alert(xhr.responseText); 
     }, 
     success: function (msg) { 
      alert('Call was successful!'); 
     } 
    }); 

Phương pháp được gọi là thành công, nhưng chuỗi kết quả được bao phủ bởi thẻ XML, như thế này:

<string> 
{'result':'success', 'datetime':'4/26/2010 12:11:18 PM' 
</string> 

Và tôi gặp lỗi vì điều này (trình xử lý lỗi được gọi). Có ai biết những gì có thể được thực hiện về điều này?

+0

Đâu là '}' của bạn ở cuối chuỗi JSON được trả về? –

+0

Bạn có nghĩa là chuỗi json được bao phủ bởi các thẻ XML không? Tôi nghĩ rằng tôi đã làm điều gì đó sai trái khi tôi sao chép nó từ cửa sổ trình duyệt, tất nhiên là nó nên ở đó. –

+0

Có lẽ, nhưng tôi cũng không thấy mã này trong mã dịch vụ web. –

Trả lời

0
  1. Rule cho json: Bạn chỉ có thể truy cập dữ liệu từ cùng miền!

  2. Ngoại lệ duy nhất là khi sử dụng jsonp (thực hiện khá phức tạp vì không có bộ nối tiếp jsonp trong khuôn khổ .NET).
    Nếu bạn đang sử dụng một dịch vụ web chuẩn (và không WCF), bạn có thể tìm thấy hướng dẫn thực hiện điều này howto here.

+0

Hiện tại, tôi cần đủ để truy cập dữ liệu trong cùng một miền. Nhưng ngay cả khi tôi mở URL như thế này http: //localhost/testwebsite/TestWebService.asmx/Test2 trong trình duyệt trên máy cục bộ của mình, tôi thấy XML được hiển thị. Điều duy nhất tôi cần bây giờ là loại bỏ XML –

0

Hãy chắc chắn để thêm video này vào tùy chọn ajax của bạn:

contentType: "application/json; charset=utf-8" 

yêu cầu tổng thể của bạn sẽ trông như thế này để có được json trở lại thay vì XML:

$.ajax({ type: "GET", 
    url: "http://localhost/testwebsite/TestWebService.asmx/Test2", 
    data: "{}", 
    contentType: "application/json", 
    dataType: "json", 
    contentType: "application/json; charset=utf-8". 
    error: function (xhr, status, error) { 
     alert(xhr.responseText); 
    }, 
    success: function (msg) { 
     alert('Call was successful!'); 
    } 
}); 

ScottGu has a full breakdown on what's required here, nhưng nó trông giống như thiếu contentType trong trường hợp của bạn (một trong đó đã khiến tôi mất nhiều thời gian).

+0

Thay đổi contentType không có hiệu lực –

+0

@the_V - Lỗi gì là cảnh báo? cũng chỉ để đá, bạn có nhận được cùng một hành vi với POST không? –

+0

POST hoạt động tốt, nhưng tôi muốn làm cho nó hoạt động với GET. Giới thiệu về lỗi: xhr.responseText đang theo dõi - {'result': 'success', 'datetime': '27.04.2010 0:57:30'

0

Bạn có thể thử đặt ResponseFormat trên các phương pháp của mình. Xem http://williamsportwebdeveloper.com/cgi/wp/?p=494 để xem cách họ đã làm điều đó cho JSON. Nó có lẽ chỉ mặc định là XML.

+0

Tôi đã cố gắng thêm thuộc tính sau để phương pháp định nghĩa: [ScriptMethod (ResponseFormat = ResponseFormat.Json, UseHttpGet = true, XmlSerializeString = false)] nhưng nó đã không 't work –

0

Bạn cần để trang trí các phương pháp với ScriptMethodAttribute:

[WebService(Namespace = "http://something.com/samples")] 
[ScriptService] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class TestWebService : System.Web.Services.WebService { 

    [WebMethod] 
    [ScriptMethod] 
    public string Test2() 
    { 
    [...] 
    } 
} 

này sẽ đảm bảo rằng phương thức trả về JSON theo mặc định (giá trị mặc định của ResponseFormatJson).

+0

[ScriptMethod] thuộc tính không có hiệu lực –

0

Bạn có thử WebInvokeAttribute, nó có các thành viên xác định Yêu cầu & định dạng đáp ứng nơi bạn có thể thiết lập để WebMessageFormat.Json.
Cái gì như:
[WebInvoke(UriTemplate = "ServiceName", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, Method = "POST")]

0
  1. Bạn có thể sử dụng bộ xử lý thay vì http dịch vụ web.
  2. Bạn có thể phân tích cú pháp phản hồi xml với javascript trên máy khách.