2013-07-25 14 views
5

Oto moja sytuacja. W interfejsie WebForms implementuję interfejs API WEB. Mam kilka klas dynamicznych, które są zasadniczo słownikami, które muszą używać niestandardowego formatyzatora serializacji JSON, aby działać poprawnie (ponieważ domyślny konwerter po prostu pokazuje bałagan parowania wartości klucza).ASP.NET Web API Niestandardowy JsonConverter nigdy nie jest nazywany

Więc najpierw stworzyłem własny JSON Przelicznik:

/// <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. 
    } 
} 

Raz ja zdefiniowano Potem włóż ją do globalnej JSON typu mediów formater:

 // 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()); 
     } 

I wreszcie, mój testu API (w przyszłości będzie dużo więcej, próbuję przetestować system na razie, "Kontakt" dziedziczy po "Entity"):

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". 
    } 
} 

Więc oto co widzę kiedy debugowania:

Web Site Calls "dostać":

  1. Controller.Get nazywa. Zwraca listę kontaktów.
  2. Konwerter.CanConvert jest wywoływany dla typu wyliczenia. Zwraca false.
  3. Konwerter.CanConvert jest wywoływany dla typu kontaktu. Zwraca true.
  4. Konwerter.CanWrite jest wywoływany. Zwraca true.
  5. Konwerter.WriteJson jest wywoływany. Zapisuje właściwy JSON do strumienia
  6. Witryna odbiera właściwy JSON i jest w stanie używać go jako obiektu.

Web Site Calls "update":

  1. Converter.CanConvert nazywany jest dla rodzaju kontaktów. Zwraca true.
  2. Wywoływany jest kontroler.Update. Parametr "kontakt" to "null".

Jestem kompletnie zakłopotany. Nie rozumiem, dlaczego to działa podczas serializacji, ale cały proces wydaje się po prostu pomijać mój niestandardowy konwerter podczas próby deserializacji. Ktoś ma jakieś pomysły, co robię źle?

Dzięki!

Odpowiedz

6

Ah geez. Teraz jestem głupi.

... Nie wysyłałem JSON w danych pocztowych. Przypadkowo wysłałem zbieraninę tekstu. Whoops ...

Nieważne!

+0

Cieszę się, że to wymyśliłeś. Powinieneś oznaczyć swoją odpowiedź jako zaakceptowaną, aby ludzie wiedzieli, że problem został rozwiązany. –

+1

Zamierzam. Stack Overflow nie pozwoli mi jednak do jutra. –

Powiązane problemy