2009-07-13 8 views
12

Tôi đã thấy một câu hỏi tương tự nhưng nó không giải quyết được sự cố của tôi. Tôi có một dịch vụ web JSON trong một tệp ASMX;Dịch vụ web ASP.NET JSON luôn trả về phản hồi JSON được bao bọc trong XML

Mã cho phương pháp web

 [WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     public string GetUserRoles(string JSONUserCode) 
     { 
      string retRoles = string.Empty; 
      List<JSONRole> roles = new List<JSONRole>(); 

      {... I Populate the roles here ...} 

      DataContractJsonSerializer serializer = new 
      DataContractJsonSerializer(roles.GetType()); 
      MemoryStream ms = new MemoryStream(); 
      serializer.WriteObject(ms, roles); 
      string jsonString = Encoding.Default.GetString(ms.ToArray()); 
      ms.Close(); 
      return jsonString; 
     } 

định dạng một cách chính xác này Danh mục một cách chính xác nhưng kết thúc tốt đẹp toàn bộ trở lại trong XML. Dưới đây là câu trả lời:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://formshare.com/"> 
     [{"Name":"Accounts Payable"},{"Name":"Payroll"}] 
    </string> 

Bạn có thể xem phản ứng tự của bạn bằng cách nhấn vào liên kết này:

http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles?JSONUserCode=1234

tôi cần câu trả lời là chỉ:

[{"Name":"Accounts Payable"},{"Name":"Payroll"}] 

Bất kỳ ý tưởng ? Cảm ơn bạn đã giúp đỡ.

Trả lời

11

WebMethod có thể phân phát cùng một thông tin cả dưới dạng XML và JSON. Bạn cần chỉ định định dạng bạn muốn (dataType) trong ứng dụng khách, khi bạn gửi yêu cầu của mình.

Ngoài ra, bạn không được phép tuần tự hóa đối tượng thành JSON theo cách thủ công, mà thay vào đó, hãy trả về vai trò và nó sẽ được tuần tự hóa thành JSON nếu khách hàng của bạn yêu cầu dữ liệu dưới dạng JSON.

EDIT

jQuery dụ (chú ý tham số datatype):

$.ajax({ 
    type: 'GET', 
    url: 'http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles', 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    data: '{"JSONUserCode":"1234"}', 
    success: myCallback 
}); 

Điều đáng nói rằng đối tượng sẽ không được trả lại theo định dạng chính xác mà bạn chỉ định, nhưng đúng hơn, được bọc trong một đối tượng:

{ d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] } 

Điều này, tuy nhiên, thực sự rất mong muốn, for added security

+0

Liệu có cách nào để xác định Datatype trong một POST? – JohnnyCantCode

+0

Tôi không chắc chắn tôi làm theo ... ví dụ trên là POST. –

+0

Tôi xin lỗi, ý tôi là chuyển tham số trong URL giống như URL tôi đã đưa vào câu hỏi của mình. – JohnnyCantCode

1

Đảm bảo lớp dịch vụ của bạn có thuộc tính [ScriptService]. Thuộc tính này không được thêm theo mặc định.

1

Hãy thử dùng Jayrock cho .NET. Đây là trình xử lý gọn gàng cho .NET JSON RPC. Nó sẽ làm chính xác những gì bạn cần. Có một hướng dẫn từng bước cho ASP .NET JSON RPC here.

0

Chúng tôi đã thực hiện một trang khác gọi phía máy chủ dịch vụ và ghi phản hồi (trong trường hợp của chúng tôi là .aspx). Chúng tôi đã dọn sạch tất cả mã HTML, phần đầu của tài liệu và tạo mã phía máy chủ để gọi dịch vụ và trả lời.

(trong trường hợp aspx chỉ để lại chỉ thị trang ở trên cùng)

theo cách này bạn có thể nhận được chuỗi sạch.

Bằng cách này, nếu điều này làm lộ ứng dụng của chúng tôi đối với bất kỳ mối đe dọa bảo mật hoặc lần truy cập hiệu suất lớn nào, tôi thực sự đánh giá cao nhận xét. Chỉ cần quá bận rộn để yêu cầu ở đây hoặc tìm kiếm trên đó :)

1

Tôi đã phạm sai lầm tương tự bằng cách xử lý tuần tự. Bạn không được phép trả về chuỗi nhưng chính đối tượng đó.

Nếu bạn đã phát triển một trăm Dịch vụ như thế này, một công việc xung quanh bạn: chỉ cần tạo aspx, ServiceCaller.aspx, xóa mọi thứ trong html chỉ để lại chỉ thị trang và sử dụng codebehind để gọi dịch vụ và trả lời . Viết chuỗi. Cũng lấy tên phương thức dịch vụ làm tham số như "HelloWorld" và sử dụng sự phản chiếu để gọi nó.

Đó là kinda cho thấy tai trái của bạn bằng tay phải nhưng nó hoạt động. Bạn cũng có thể dễ dàng tích hợp một vai trò quản lý và sử dụng sự phản ánh lấy tên dịch vụ như chuỗi kiểm tra db nếu người dùng có thể gọi dịch vụ này và với sự phản ánh Gọi phương thức.

(bất kỳ nhận xét nào về điều này đều được chào đón :)

0

Từ khóa "tĩnh" duy nhất của bạn trong khai báo phương pháp, hãy xem xét điều sau nó sẽ hoạt động.

FYI: Tất cả các phương pháp web nên tĩnh

[WebMethod] [ScriptMethod (ResponseFormat = ResponseFormat.Json)]

public static string GetUserRoles(string JSONUserCode) 
    { 
     string retRoles = string.Empty; 
     List<JSONRole> roles = new List<JSONRole>(); 

     {... I Populate the roles here ...} 

     DataContractJsonSerializer serializer = new 
     DataContractJsonSerializer(roles.GetType()); 
     MemoryStream ms = new MemoryStream(); 
     serializer.WriteObject(ms, roles); 
     string jsonString = Encoding.Default.GetString(ms.ToArray()); 
     ms.Close(); 
     return jsonString; 
    } 
3

Hóa ra nó không phải datatype mà đếm nhưng

contentType: 'application/json; charset=utf-8'. 

Nó hoạt động như một sự quyến rũ.

0

Thay vì trả lại một chuỗi trong sử dụng WebMethod của bạn:

JavaScriptSerializer js = new JavaScriptSerializer(); 
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));