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

goo*_*oon 8 .net serialization json dotnet-httpclient asp.net-web-api2

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

HttpClient响应ReadAsAsync()没有完全反序列化对象

事实证明,我通过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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么我看到这种行为以及如何在不从我的数据类中删除[Serializable]属性的情况下绕过它?

War*_*War -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>();
            }
}
Run Code Online (Sandbox Code Playgroud)

然后要使用它,您可以在异步方法中执行类似的操作...

var customer = await ApiUtil.GetCustomer(1);
Run Code Online (Sandbox Code Playgroud)

如果您在调用此方法时无法使用 async 和 wait ,请尝试类似...

var customerTask = ApiUtil.GetCustomer(1);
customerTask.Wait();
var customer = customerTask.Result;
Run Code Online (Sandbox Code Playgroud)

  • 这并不能解决问题,即标记为 [Serializable] 的类不会被 ReadAsAsync&lt;T&gt; 反序列化。等待是无关紧要的。 (2认同)