2013-07-25 26 views
5

Vì vậy, đây là tình huống của tôi. Tôi đang triển khai API WEB trong ứng dụng WebForms. Tôi có một loạt các lớp năng động mà về cơ bản là các từ điển cần sử dụng một trình định dạng tuần tự hóa JSON tùy chỉnh để hoạt động đúng (vì trình chuyển đổi mặc định chỉ hiển thị một mớ hỗn độn của các cặp khóa giá trị).ASP.NET Web API Tuỳ chỉnh JsonConverter không bao giờ được gọi là

Vì vậy, đầu tiên tôi tạo ra một tùy chỉnh JSON chuyển đổi:

/// <summary> 
/// A class to convert entities to JSON 
/// </summary> 
public class EntityJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType.IsSubclassOf(typeof(Entity)); 
    } 

    public override bool CanRead 
    { 
     get { return true; } 
    } 

    public override bool CanWrite 
    { 
     get { return true; } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     // Details not important. This code is called and works perfectly. 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     // Details not important. This code is *never* called for some reason. 
    } 
} 

Một khi tôi đã có định nghĩa tôi sau đó chèn nó vào JSON phương tiện truyền thông kiểu toàn cầu định dạng:

 // Add a custom converter for Entities. 
     foreach (var formatter in GlobalConfiguration.Configuration.Formatters) 
     { 
      var jsonFormatter = formatter as JsonMediaTypeFormatter; 
      if (jsonFormatter == null) 
       continue; 

      jsonFormatter.SerializerSettings.Converters.Add(new EntityJsonConverter()); 
     } 

Và cuối cùng, thử nghiệm API của tôi (sẽ có nhiều nội dung được thêm vào trong tương lai, tôi chỉ đang cố gắng thử nghiệm hệ thống hiện tại, "Liên hệ" kế thừa từ "Pháp nhân"):

public class ContactController : ApiController 
{ 
    public IEnumerable<Contact> Get() 
    { 
     // Details not important. Works perfectly. 
    } 

    [HttpPost] 
    public bool Update(Contact contact) 
    { 
     // Details not important. Contact is always "null". 
    } 
} 

Vì vậy, đây là những gì tôi nhìn thấy khi tôi gỡ lỗi:

trang web kêu gọi "nhận được":

  1. Controller.Get được gọi. Trả về danh sách Liên hệ.
  2. Converter.CanConvert được gọi cho kiểu liệt kê. Trả về false.
  3. Converter.CanConvert được gọi cho loại Liên hệ. Trả về true.
  4. Converter.CanWrite được gọi. Trả về true.
  5. Converter.WriteJson được gọi. Ghi JSON thích hợp vào luồng
  6. Trang web nhận JSON thích hợp và có thể sử dụng nó làm đối tượng.

trang web kêu gọi "cập nhật":

  1. Converter.CanConvert được gọi cho các loại Liên hệ. Trả về true.
  2. Controller.Update được gọi. thông số "contact" là "null".

Tôi hoàn toàn bị lúng túng. Tôi không hiểu tại sao điều này làm việc khi serializing, nhưng toàn bộ quá trình dường như chỉ bỏ qua chuyển đổi tùy chỉnh của tôi khi cố gắng deserialize. Bất cứ ai có bất kỳ ý tưởng những gì tôi đang làm sai?

Cảm ơn!

Trả lời

6

Ah geez. Bây giờ tôi cảm thấy câm.

... Tôi đã không gửi JSON trong dữ liệu bài đăng. Tôi vô tình gửi một mớ văn bản. Rất tiếc ...

Nevermind!

+0

Rất vui khi bạn hiểu điều đó. Bạn có lẽ nên đánh dấu câu trả lời của bạn như được chấp nhận để mọi người biết vấn đề được giải quyết. –

+1

Tôi dự tính. Stack Overflow sẽ không cho phép tôi cho đến ngày mai. –

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