HttpClient.ReadAsAsync <t>使用[Serializable] </t>时返回空对象

时间:2014-04-24 21:54:55

标签: .net json serialization dotnet-httpclient asp.net-web-api2

我正在使用Microsoft ASP.NET Web API客户端库(版本4.0.30506,因为我必须在.NET Framework 4.0上运行)来与.NET Web API进行交互。我已经确认数据正在接收。但是,从ReadAsAsync调用返回的对象是未填充的(非空)。在网上挖掘后,我发现了这篇SO帖子(也见答案):

HttpClient response ReadAsAsync() doesn't fully deserialize object

事实证明,我通过JSON发送给客户端的对象被标记为[Serializable],并且删除此属性会使一切正常(我已通过测试确认)。但是,这些对象需要[Serializable]属性用于其他应用程序中使用的其他场景,因此只是删除属性不是一个选项。

我的代码如下所示。当[Serializable]属性应用于Customer对象时,Get方法的调用(未显示)返回未填充的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]属性的情况下解决这个问题?

1 个答案:

答案 0 :(得分:-1)

尝试这样的事情......

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;