3

Я работаю с клиентскими библиотеками веб-API Microsoft ASP.NET (версия 4.0.30506, так как я должен работать на .NET Framework 4.0) для взаимодействия с. NET веб-API. Я подтвердил, что данные получены штрафом. Однако объект, возвращенный из вызова ReadAsAsync, остается незаселенным (не нулевым). После того, как копаться в Интернете, я нашел, что это ТАК опубликовать (см ответ, а):HttpClient.ReadAsAsync <T> Возвращает пустой объект при использовании [Serializable]

HttpClient response ReadAsAsync() doesn't fully deserialize object

Оказывается, объекты, которые я посылаю к клиенту через JSON помечены [Serializable] и удаление этот атрибут заставляет все работать нормально (что я подтвердил с помощью тестирования). Однако для этих объектов необходим атрибут [Serializable] для других сценариев, где они используются в других приложениях, поэтому просто удаление атрибута на самом деле не является вариантом.

Мой код показан ниже. Вызовы (не показаны) методу Get возвращают непопущенный объект Customer, когда атрибут [Serializable] применяется к объекту Customer (как показано). Когда атрибут удаляется, возвращаемый объект Customer является заселенным по свойствам.

[Serializable] 
    public class Customer 
    { 
     public string Name { get; set; } 
    } 

    public class WebAPIClient 
    { 
     private readonly HttpClient _httpClient; 

     public WebAPIClient(Uri baseAddress) 
     { 
      _httpClient = new HttpClient(); 
      _httpClient.BaseAddress = baseAddress: 
      _httpClient.DefaultRequestHeaders.Accept.Clear(); 
      _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     } 

     public Customer Get(int id) 
     { 
      string url = [code that builds url] + id.ToString(); 
      HttpResponseMessage response = _httpClient.GetAsync(url).Result; 
      response.EnsureSuccessStatusCode(); 
      return response.Content.ReadAsAsync<Customer>().Result; 
     } 
    } 

Может кто-нибудь объяснить, почему я вижу такое поведение и как я могу получить вокруг него, не снимая [Serializable] атрибут из моих классов данных?

+0

Где твоя json? Что такое 'TEntity'? Как насчет публикации [SSCCE] (http://www.sscce.org/) –

+0

Дополнительная кодировка добавлена ​​для контекста и ясности. – goombaloon

+2

Я нашел решение [здесь] [1] и подтвердил, что он работает. [1]: http://stackoverflow.com/questions/20914080/make-json-net-and-serializable-attribute-work-together – goombaloon

ответ

-2

Попробуйте что-то вроде этого ...

public static class ApiUtil 
{ 
    static HttpClient GetApiClient() 
      { 
       var client = new HttpClient(); 
       client.BaseAddress = new Uri(ConfigurationManager.AppSettings["apiUrl"]); 
       return client; 
      } 

    public static async Task<Customer> GetCustomer(int id) 
      { 
       var client = GetApiClient(); 
       string query = "Customers(" + id + ")"; 
       var response = await client.GetAsync(query); 
       return await response.Content.ReadAsAsync<Customer>(); 
      } 
} 

затем использовать это, вы могли бы сделать что-то подобное в методе асинхронной ...

var customer = await ApiUtil.GetCustomer(1); 

если вы наклоненное использование асинхронного и ждать, когда позвонив сюда, попробуйте что-то вроде ...

var customerTask = ApiUtil.GetCustomer(1); 
customerTask.Wait(); 
var customer = customerTask.Result; 
+1

Это не решит проблему, которая заключается в том, что класс, помеченный [Serializable], не десериализуется ReadAsAsync . Ожидание не имеет значения. – EKW

+0

Я полностью согласен, что я просто решил использовать задачи, я могу заверить, что приведенный выше пример кода отлично работает для меня по типам, которые я обозначил как сериализуемые. Этот код был скопирован из моей базы кода (в настоящее время работает в производственной среде), поэтому я уверен, что он работает над типами, которые у меня есть ... может быть, проблема не в сериализации? – War

+0

Думал, что я бы ответил на это ... дело не в том, что код не работает, а в том, что это не был хороший ответ. OP нашел ответ на несколько иной вопрос (добавив [JsonObject]), я бы хотел, чтобы они добавили его в качестве ответа здесь. – EKW