2014-11-18 2 views
-1

У меня есть абстрактный класс с JsonConverter атрибут как так:Использование JsonConverter по запросу GET в Web Api

[JsonConverter(typeof(SurveyItemConverter))] 
public abstract class SurveyItem:ISurveyItem 
{ 
    private class SurveyItemConverter : JsonCreationConverter<ISurveyItem> 
    { 
     protected override ISurveyItem Create(Type objectType, Newtonsoft.Json.Linq.JObject jObject) 
     { 
      var type = (SurveyItemType)jObject.Value<int>("Type"); 

      switch (type) 
      { 
       case SurveyItemType.Label: 
        return new SurveyLabel(); 
       case SurveyItemType.Textbox: 
        return new SurveyTextbox(); 
       case SurveyItemType.TextArea: 
        return new SurveyTextArea(); 
       case SurveyItemType.CheckBoxGroup: 
        return new SurveyCheckboxGroup(); 
       case SurveyItemType.Checkbox: 
        return new SurveyCheckbox(); 
       case SurveyItemType.RadioGroup: 
        return new SurveyRadioGroup(); 
       case SurveyItemType.RadioButton: 
        return new SurveyRadioButton(); 
       case SurveyItemType.Email: 
        return new SurveyEmail(); 
       case SurveyItemType.Telephone: 
        return new SurveyTelephone(); 
       case SurveyItemType.Number: 
        return new SurveyNumber(); 
       case SurveyItemType.DateTime: 
        return new SurveyDate(); 
       case SurveyItemType.Password: 
        return new SurveyPassword(); 
       case SurveyItemType.Url: 
        return new SurveyUrl(); 
       case SurveyItemType.ProfileName: 
        return new SurveyProfileName(); 
       default: 
        throw new ArgumentOutOfRangeException(); 
      } 
     } 
    } 

    public string Label { get; set; } 
    public int Id { get; set; } 
    public SurveyItemType Type { get; set; } 
} 

Это прекрасно работает, если запрос является POST/PUT, но с запросом GET он не:

Cannot create an abstract class 

контроллер, который обрабатывает запрос GET имеет метод с сигнатурой (этот метод для браузеров, которые не поддерживают CORS):

[HttpGet] 
public async Task<IHttpActionResult> SubmitSurvey(HttpRequestMessage request, [FromUri] Survey survey)//survey contains a List<SurveyItem> 

Почему он не использует JsonConverter? Как я могу заставить JsonConverter работать с этим методом?

ответ

2

Веб-API использует согласование типа контента, чтобы определить, какой десериализатор использовать. Запрос GET не имеет тела и, следовательно, не имеет типа содержимого. Веб-API не ожидает найти JSON в URL-адресе, поэтому в этом случае он не использует Json.Net, и ваш конвертер не будет вызван. Очевидно, что лучшим выбором является использование POST, но если у вас есть, чтобы заставить его работать с ГЭТ вам нужно будет либо:

  • Отправить данные как параметры строки стандартного запроса (не JSON);
  • получает JSON из URL-адреса в виде строки и вручную десериализует его; или
  • реализация пользовательского связующего, который знает, что нужно искать и вставлять, что в Web API трубопровод

Вот similar question, которые могли бы иметь некоторую помощь в отношении первых двух вариантов.