2012-02-22 32 views
6

Tôi hiện đang làm việc trên ứng dụng PhoneGap giao tiếp với cơ sở dữ liệu của chúng tôi thông qua dịch vụ web WCF.WCF Service chấp nhận chuỗi JSON đơn giản nhưng từ chối bộ JSON với lỗi 400

Tôi đã thực hiện nhiều yêu cầu tới máy chủ và truy xuất dữ liệu mà không gặp vấn đề gì nhưng trong mỗi trường hợp tôi chỉ chuyển một vài tham số dưới dạng chuỗi JSON mà tôi đã tạo theo cách thủ công (không xâu chuỗi). Bây giờ tôi đã gặp phải một vấn đề khi cố đọc từ cơ sở dữ liệu SQLite cục bộ của tôi và sau đó gửi thông tin dưới dạng JSON tới dịch vụ web. Dịch vụ trả lại lỗi 400 với các thông tin sau:

Lỗi trong quá trình deserializing nội dung của yêu cầu cho hoạt động 'uploadData'. OperationFormatter đã gặp phải một Message message không hợp lệ. Dự kiến ​​sẽ tìm một thuộc tính có tên 'type' và value 'object'. Đã tìm thấy giá trị 'mảng'.

tôi mã hóa JSON như sau:

database.transaction(function(tx) { 
    var query = "SELECT * FROM someTable WHERE something=something"; 
    tx.executeSql(query, [], function(tx, results) { 
     var resultSet = new Array(); 

     for (i=0; i<results.rows.length; i++) { 
      var row = results.rows.item(i); 
      resultSet[i] = row;   
     } 

     var json = JSON.stringify(resultSet); 
    } 
} 

Sau đó tôi gửi chuỗi JSON qua một yêu cầu ajax sử dụng jQuery:

$.ajax({ 
      type: "POST", 
      url: "http://someurl/myService.svc/uploadData", 
      contentType: "application/json; charset=utf-8", 
      data: json, 
      dataType: "json", 
      success: function (data) {/*do something*/}, 
      error: function(jqXHR, textStatus, errorThrown) { 
       $('#test').html(textStatus + " - " + errorThrown + " - " + jqXHR.responseText); 
      } 
     }); 

dịch vụ web của tôi chỉ giữ ném trở lại cùng một lỗi. Câu hỏi của tôi là ... Làm thế nào tôi có thể đọc từ cơ sở dữ liệu cục bộ và chuyển đổi tập kết quả thành chuỗi JSON có thể sử dụng được gửi qua ajax.

Xin cảm ơn trước. Nếu cần thêm thông tin hoặc vấn đề không rõ ràng, vui lòng cho tôi biết và tôi sẽ cố gắng hết sức để cung cấp thêm thông tin.

EDIT: Đã cố gắng xóa bỏ chuỗi nhưng tôi vẫn nhận được lỗi 400. Tuy nhiên, lỗi này hơi khác một chút so với thời điểm này:

Lỗi trong cơ thể deserializing của thông điệp yêu cầu cho hoạt động 'uploadData'. OperationFormatter đã gặp phải một Message message không hợp lệ. Đã gặp phải ký tự không mong muốn 'u'.

EDIT: Tôi đã phát hiện ra rằng ngay cả chuỗi JSON được tạo thủ công hoàn toàn hợp lệ vẫn gây ra lỗi. Điều này không xảy ra khi gửi một vài tham số như:

{"name" : "dean", "age" : 23} 

Nó hoạt động hoàn toàn tốt. Nó chỉ từ chối bộ kết quả như:

[{"name" : "dean", "age" : 23},{"name" : "bob", "age" : 25}] 

Phương pháp này được định nghĩa trong giao diện WCF như sau:

[OperationContract] 
[WebInvoke(Method = "POST", 
      BodyStyle = WebMessageBodyStyle.Wrapped, 
      ResponseFormat = WebMessageFormat.Json, 
      RequestFormat = WebMessageFormat.Json)] 

string uploadData(string data); 

Có vẻ như đó là chi tiết của một vấn đề với các dịch vụ WCF hơn chuỗi JSON chính nó. Có ai biết tại sao WCF sẽ chấp nhận một chuỗi JSON đơn giản nhưng từ chối một bộ? Đây là một vấn đề lớn đã dừng hoàn toàn sự phát triển của dự án nên bất kỳ sự giúp đỡ nào cũng được đánh giá cao!

SOLVED: Thay vì truyền chuỗi JSON được mã hóa trực tiếp, thay vào đó tôi gửi là giá trị của một chuỗi JSON khác với khóa "dữ liệu" chính.Vì vậy, như trên tôi có kết quả SQLite của tôi là:

var json = JSON.stringify(resultSet); 

sau đó tôi vượt qua nó để các dịch vụ WCF như sau:

... 
data: JSON.stringify({ data : json }), 
... 

Và nó bây giờ hoạt động tốt.

Trả lời

-1

Bước JSON.stringify không cần thiết vì công cụ AJAX của jQuery tự động thực hiện điều đó. Chỉ cần vượt qua trong mảng kết quả được ấn định là data tài sản trong các tùy chọn theo yêu cầu:

... 
data: resultSet, 
... 

Những gì bạn đang làm gì bây giờ được stringifying một mảng để JSON, sau đó hỏi jQuery để-restringify rằng kết quả là chuỗi như JSON trước khi gửi nó đến máy chủ.

+0

Cảm ơn Matt, điều đó giải thích một vài điều. Bây giờ tôi về nhà nhưng tôi sẽ thử vào sáng mai. – dekin88

+0

Đã cố gắng giải quyết nhưng vẫn gặp lỗi 400. Cập nhật OP với chi tiết – dekin88

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