HttpClient ReadAsAsync不反序列化

本文关键字:反序列化 ReadAsAsync HttpClient | 更新日期: 2023-09-27 18:13:36

我不确定我所遇到的问题是否与我使用任务的方式有关,或者如果我没有正确使用ReadAsAsync。我正在遵循我在这里找到的模式:

http://blogs.msdn.com/b/henrikn/archive/2012/02/11/httpclient-is-here.aspx

背景:我反序列化的对象是一个POCO。属性没有属性。它只是几个值类型属性和几个集合属性。REST服务似乎也可以正常工作。当我查看服务返回的JSON时,它似乎没有问题。使用Web API 2.1 5.1.2

问题:. .正在调用HttpResponseMessage.Content.ReadAsAsync()。有时它工作(返回一个对象),有时它不(抛出"线程被中止"或返回null)。看起来content属性只能读取一次,随后的读取会抛出错误。请参阅下面代码中的注释。

相关问题:HttpContent。ReadAsAsync反序列化问题

这个问题似乎和我的相似。答案是一个错误,但这是超过两年的时间。

代码:

[TestMethod]
    public void AddSiteTest()
    {
        // Use POST to create a resource i.e. insert.  Use PUT to update.
        Site site = new Site {SiteName = "Test", Active = true, URI="www.test.com" };
        Site newSite = null;
        client.PostAsJsonAsync<Site>(baseURI + "/Sites/AddSite?securityKey="+ SecurityKey, site).ContinueWith(x =>
            {
                HttpResponseMessage response = x.Result;
                response.EnsureSuccessStatusCode();
                if (response.IsSuccessStatusCode)
                {
                    try
                    {
                        string str = Task.Run(() => response.Content.ReadAsStringAsync()).Result;      // yep its json and it is a proprety serialized object
                        // Method 1 (preferred... ):
                        //Site siteA = Task.Run(() => response.Content.ReadAsAsync<Site>()).Result;      // usuallly throws if content has been read  

                        // Method 2:
                        Site siteB = response.Content.ReadAsAsync<Site>().Result;                      // usully returns a valid result (when I dont put a breakpoint on it). Does not deadlock.
                        // Method 3:
                        response.Content.ReadAsAsync<Site>().ContinueWith(d => 
                        {
                            Site siteC = d.Result;                                                    // returns null
                        });
                    }
                    catch (Exception ex)
                    {
                        string y = ex.Message;
                    }
                }
            });
    }

HttpClient ReadAsAsync不反序列化

尝试使用await:

string str = await response.Content.ReadAsStringAsync();

你必须在void之前添加async