2008-11-14 71 views
25

Tôi đang sử dụng .Net framework 2.0/jQuery để thực hiện cuộc gọi Ajax tới dịch vụ web 2.0. Không có vấn đề gì tôi đặt contentType vào trong cuộc gọi ajax, dịch vụ luôn trả về XML. Tôi muốn nó trả lại Json!Cách trả về JSON từ dịch vụ web asmx 2.0

Đây là cuộc gọi:

 $(document).ready(function() { 
     $.ajax({ 
      type: "POST", 
      url: "DonationsService.asmx/GetDate", 
      data: "{}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function(msg) { 
       // Hide the fake progress indicator graphic. 
       $('#RSSContent').removeClass('loading'); 

       // Insert the returned HTML into the <div>. 
       $('#RSSContent').html(msg.d); 
      } 
      }); 
     });  

Dưới đây là những gì tiêu đề yêu cầu trông giống như trong Fiddler:

POST /DonationsService.asmx/GetDate HTTP/1.1 
x-requested-with: XMLHttpRequest 
Accept-Language: en-us 
Referer: http://localhost:1238/text.htm 
Accept: application/json, text/javascript, */* 
Content-Type: application/json; charset=utf-8 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; eMusic DLM/4; .NET CLR 2.0.50727) 
Host: localhost:1238 
Content-Length: 2 
Connection: Keep-Alive 
Pragma: no-cache 

Tôi đã cố gắng thiết lập contentType để 'text/json' và nhận được cùng một các kết quả.

Dưới đây là phương pháp dịch vụ web:

<WebMethod()> _ 
Public Function GetDate() As String 

    'just playing around with Newtonsoft.Json 
    Dim sb As New StringBuilder 
    Dim sw As New IO.StringWriter(sb) 
    Dim strOut As String = String.Empty 

    Using jw As New JsonTextWriter(sw) 
     With jw 
      .WriteStartObject() 
      .WritePropertyName("DateTime") 
      .WriteValue(DateTime.Now.ToString) 
      .WriteEndObject() 
     End With 
     strOut = sw.ToString 
    End Using 

    Return strOut 

End Function 

và đây là những gì nó sẽ trả về:

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://DMS.Webservices.org/">{"DateTime":"11/13/2008 6:04:22 PM"}</string> 

Có ai biết làm thế nào để buộc các dịch vụ web để trở Json khi tôi yêu cầu Json?

Xin vui lòng không cho tôi biết để nâng cấp lên .Net Framework 3.5 hoặc bất cứ điều gì như thế (tôi không phải là ngu ngốc). Tôi cần một giải pháp 2.0.

+0

Có thể bạn có thể sử dụng giải pháp của mình; http://stackoverflow.com/questions/26140330/call-javascript-function-from-asmx – Erdogan

+0

Bạn có thể thử giải pháp của mình; http://stackoverflow.com/questions/26140330/call-javascript-function-from-asmx – Erdogan

Trả lời

35

Không thành vấn đề với return JSON from ASMX services in ASP.NET 2.0. Bạn chỉ cần cài đặt ASP.NET AJAX Extensions.

Đảm bảo thêm trang trí [ScriptService] vào dịch vụ web của bạn. Đó là những gì hướng dẫn phần phía máy chủ của khung ASP.NET AJAX để trả về JSON cho một yêu cầu được định dạng đúng.

Ngoài ra, bạn sẽ cần phải thả ".d" từ "msg.d" trong ví dụ của tôi, nếu bạn đang sử dụng nó với 2.0.The ".d" is a security feature that came with 3.5.

+0

Đáng buồn thay, liên kết mã hóa đó hiện đang kích hoạt cảnh báo trang tấn công trong trình duyệt của tôi. – TrojanName

2

Bạn có thể không thể làm bất kỳ điều gì khác ngoài XML hoặc chuỗi tuần tự nhị phân trong .NET 2.0. Nếu bạn không sử dụng tham chiếu web autogenerated thì đừng bận tâm với ASMX. Chỉ cần sử dụng ASPX hoặc ASHX.

+1

ASHX là câu trả lời của bạn –

0

Tôi có thể không chính xác 100% về điều này nhưng tôi chắc chắn rằng dịch vụ web .net là dựa trên XML/SOAP.

Bạn cần ghi đè hành vi mặc định của dịch vụ web. Tôi không hoàn toàn chắc chắn rằng điều này thậm chí sẽ có thể.

Tôi biết đây không phải là câu trả lời hữu ích nhất, nhưng có thể giúp bạn đi đúng hướng.

10

Bạn cần phải trang trí phương pháp web của bạn như sau:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

Bạn đã có những phần còn lại ngay :)

Thông tin thêm tại EncosiaAndrew Roland's Blog

EDIT: Như đã đề cập bên dưới này là .NET 3.5 chỉ (Tôi không biết điều này, xấu của tôi).

+2

Các 'ResponseFormat' liệt kê chỉ được hỗ trợ từ 3.5 trở đi, OP hỏi làm thế nào để làm trong FW 2.0. – Kev

+1

@Kev OP là gì? – Omu

+2

@Omu Bản gốc như trong người đã đặt câu hỏi (hoặc trong diễn đàn người đã bắt đầu chủ đề) –

2

Bạn có thể sử dụng Jayrock library Quick start for asp.net

này cho phép bạn viết một handler http để trả lại cho bạn json.

<%@ WebHandler Class="JayrockWeb.HelloWorld" %> 

namespace JayrockWeb 
{ 
    using System; 
    using System.Web; 
    using Jayrock.Json; 
    using Jayrock.JsonRpc; 
    using Jayrock.JsonRpc.Web; 

    public class HelloWorld : JsonRpcHandler 
    { 
     [ JsonRpcMethod("greetings") ] 
     public string Greetings() 
     { 
      return "Welcome to Jayrock!"; 
     } 
    } 
} 
+0

Tôi thực sự xem đó là một giải pháp khả thi, nếu tôi không thể làm điều đó với đồng bằng 'ol asp.net. Cảm ơn. – camainc

11

Phản hồi được bao bọc trong một phần tử bởi vì phương pháp của bạn cho biết nó sẽ trả về một chuỗi. Bạn có thể sử dụng điều này để có thể gửi json đơn giản, nhưng wsdl của bạn sẽ bị đánh lừa (chức năng bị vô hiệu nhưng không phản hồi dữ liệu).

[WebMethod(Description="return pure JSON")] 
public void retrieveByIdToPureJSON(int id) 
{ 
    Context.Response.Write(JsonConvert.SerializeObject(mydbtable.getById(id)); 
} 

Chúc may mắn, tom

Btw: xem Newtonsoft.Json cho JsonConvert

+3

Điều đó đơn giản. Thay đổi từ chức năng thành phụ (trong Vb.net) và thả trả về nhưng sử dụng một response.write để đầu ra. 2 tuần thử nhiều thứ khác nhau để loại bỏ Khi tôi thực hiện Return. Đã lưu ngày của tôi. Tnxs – KriZ

+0

lừa bẩn nhưng nó thực hiện công việc, cảm ơn :-) –

+0

Tôi muốn ôm bạn ngay bây giờ, đã cho tôi giờ để tìm giải pháp của bạn :) – Loves2Develop

1

Nó cũng có thể chỉ cần viết lên chuyển đổi JSON nhanh của riêng bạn sử dụng Refelction.

Dim sb As New StringBuilder("{") 
For Each p As PropertyInfo In myObject.GetType().GetProperties() 
    sb.Append(String.Format("""{0}"":""{1}"",", p.Name, p.GetValue(myObject, 
       Nothing).ToString())) 
Next p 

//remove the last "," because it's uneeded. 
sb.Remove(sb.Length - 1, 1) 

sb.Append("}")  
Các vấn đề liên quan