2012-06-29 31 views
17

Nâng cấp từ ASP.NET WebAPI Beta lên RC đã cung cấp một số lượng hứng thú và rất nhiều thất vọng. Tôi đã có thể làm việc thông qua phần lớn các vấn đề, nhưng cái đang cắn tôi ngay bây giờ là trường hợp nhạy cảm với dữ liệu yêu cầu JSON.ASP.NET WebAPI JSON ràng buộc trường hợp nhạy cảm

Trình định dạng được sử dụng cho các yêu cầu JSON (theo mặc định là một định dạng JSON.NET) có vẻ phân biệt chữ hoa chữ thường trong khi trình định dạng được sử dụng cho dữ liệu dạng url được mã hóa không. Có cách nào để cấu hình các yêu cầu JSON để sử dụng một trình định dạng phân biệt dạng chữ không?

Đây là một ví dụ đơn giản để minh họa cho vấn đề mà tôi đang gặp khó với yêu cầu JSON:

HTML/JavaScript

<button id="tester">Click here!</button> 

<script type="text/javascript"> 
    $(function() { 
     $("#tester").on("click", function() { 
      $.ajax({ 
       type: "POST", 
       url: "/Api/Test/Index/" + 168, 
       data: ko.toJSON({ key: 123, value: "test value" }), // THIS FAILS 
           // Key: 123, Value: "test value" <- BUT THIS WORKS 
       contentType: "application/json; charset=utf-8", 
       statusCode: { 
        200: function() { 
         $("body").append("<p>Success</p>"); 
        }, 
        400: function() { 
         $("body").append("<p>Failure</p>"); 
        } 
       } 
      }).always(function() { 
       $("body").append("<hr />"); 
      }); 
     }); 
    }); 
</script> 

C#

public class TestController : ApiController 
{ 
    public HttpResponseMessage Index(int? id, KeyValuePair<int, string> test) 
    { 
     if (id != 168 || test.Key != 123 || test.Value != "test value") 
      return Request.CreateResponse(HttpStatusCode.BadRequest); 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

Tôi đã đã cung cấp nhận xét về dòng nơi dữ liệu JSON được cung cấp. Tôi không muốn phá vỡ quy ước với các đối tượng JavaScript của tôi bởi các thành viên thuộc tính vỏ thích hợp và tôi chắc chắn không muốn phá vỡ quy ước bằng cách hạ thấp các thuộc tính C# của tôi. Có suy nghĩ gì không?

+0

Tôi là một chút nhầm lẫn ở đây. Bạn gửi dữ liệu của bạn trong một yêu cầu POST - nói cách khác, trong một cơ thể yêu cầu. Nhưng trong tài liệu HTTP, các trường tiêu đề (và các giá trị) được coi là không phân biệt chữ hoa chữ thường và không có gì về cơ thể ... Tại sao bạn nghĩ "nó không phải là hành vi cho dữ liệu dạng url", tôi tự hỏi? – raina77ow

+0

Kiểm tra [thảo luận này] (http://groups.google.com/group/soundcloudapi/browse_thread/thread/c266c0d2efa88fbb/9ad3969dde919cba), ví dụ. – raina77ow

+1

@ raina77ow Đây không thực sự là một câu hỏi về đặc điểm kỹ thuật HTTP mà là hành vi của trình định dạng JSON.NET được ASP.NET WebAPI RC sử dụng. Trình định dạng FormUrl dường như không phân biệt dạng chữ trong khi trình định dạng JSON.NET * có phân biệt chữ hoa chữ thường. –

Trả lời

6

Sau khi đào sâu vào vấn đề này trong chiều sâu đáng kể Tôi đã nhận ra rằng tôi đã đánh một lỗi trong bộ chuyển đổi Json.NET KeyValuePair. James Newton-King đã được loại, đủ để trả lời câu hỏi có liên quan của tôi và cung cấp một liên kết đến sửa chữa:

Json.NET Case-insensitive Property Deserialization

24

Trình định dạng Json.NET không phân biệt chữ hoa chữ thường cho quá trình deserialization (json -> CLR).

Khi tuần tự hóa, bạn có thể lấy vỏ lạc đà bằng cách sử dụng CamelCasePropertyNamesContractResolver.

Trong Global.asax của bạn:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
+0

Tôi tin rằng đây là trường hợp, nhưng tôi đã không thể chứng minh được hành vi đó. Vui lòng xem câu hỏi liên quan của tôi: http://stackoverflow.com/questions/11266695/json-net-case-insensitive-property-deserialization –

+0

Hmm ... Tôi vừa thực hiện một số thử nghiệm với JsonConvert. Deserializing KeyValuePair phân biệt chữ hoa chữ thường, như bạn nói, nhưng nếu tôi tạo một POCO, hành vi này chắc chắn là không phân biệt chữ hoa chữ thường. Dường như có liên quan đến KeyValuePair có getters nhưng không có setters, bởi vì tôi đã định nghĩa phiên bản KeyValuePair của riêng mình với những người định cư và đã làm việc. –

+0

Ah, bạn có thể đang làm một việc gì đó ... Tôi sẽ thực hiện thêm một số thử nghiệm và xem liệu tôi có thể xác định xem nó có deserializing với các phím cased phù hợp hay không. Cảm ơn! –

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