我正在使用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]属性的情况下解决这个问题?
答案 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;