C# ReadAsAsync调用WebAPI时未将json重构到类

C# ReadAsAsync调用WebAPI时未将json重构到类,c#,json,asp.net-web-api,asp.net-web-api2,C#,Json,Asp.net Web Api,Asp.net Web Api2,我正在调用一个WebAPI,它通过JSON从数据库返回一些内容。内容在JSON中是可见的(使用Fiddler查看),但是当我尝试将响应数据放回类中时,类中的所有值都为null public class ContentElement : ICloneable { public object Clone() { return this.MemberwiseClone(); } public int PageId { get; set; } p

我正在调用一个WebAPI,它通过JSON从数据库返回一些内容。内容在JSON中是可见的(使用Fiddler查看),但是当我尝试将响应数据放回类中时,类中的所有值都为null

 public class ContentElement : ICloneable
{
    public object Clone()
    {
        return this.MemberwiseClone();
    }
    public int PageId { get; set; }
    public string LanguageCode { get; set; }
    public int ContentId { get; set; }
    public string PageName { get; set; }
    public string Content { get; set; }
    public int? DisplayOrder { get; set; }
    public byte[] Image { get; set; } //not sure what type this should be
    public string ContentType { get; set; }
}
这过去是可行的,但现在失败了。我怀疑我可能没有正确使用GetAsync和ReadAsAsync

新注释 这是一个例子,但还有其他几个类似的调用会导致相同的问题

你有没有想过为什么这会停止工作?正确的解决方法是什么

班级:

 public class ContentElement : ICloneable
{
    public object Clone()
    {
        return this.MemberwiseClone();
    }
    public int PageId { get; set; }
    public string LanguageCode { get; set; }
    public int ContentId { get; set; }
    public string PageName { get; set; }
    public string Content { get; set; }
    public int? DisplayOrder { get; set; }
}
守则:

 public static List<ContentElement> GetContent(int siteId)
    {
        var contentElements = new List<ContentElement>();
        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri(GlobalValues.APIUri);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            AddAuthenticationHeader(client);
            var result = client.GetAsync("api/Content/GetContent/" + (object)siteId).Result;
            if (result.IsSuccessStatusCode)
            {
                contentElements.AddRange((IEnumerable<ContentElement>)result.Content.ReadAsAsync<List<ContentElement>>().Result);
            }
        }
        return contentElements;
    }
json具有“Image”和“ContentType”属性,但您的类没有。将这些作为属性添加到类中。NET无法反序列化类中的json,因为它没有与类完全相同的属性

 public class ContentElement : ICloneable
{
    public object Clone()
    {
        return this.MemberwiseClone();
    }
    public int PageId { get; set; }
    public string LanguageCode { get; set; }
    public int ContentId { get; set; }
    public string PageName { get; set; }
    public string Content { get; set; }
    public int? DisplayOrder { get; set; }
    public byte[] Image { get; set; } //not sure what type this should be
    public string ContentType { get; set; }
}
EDIT解决方法是使用Newtonsoft.Json反序列化Json,而不是使用.NET函数

contentElements.AddRange((IEnumerable<ContentElement>)JsonConvert.Deserialize<IEnumerable<ContentElement>>(result.Content));
contentElements.AddRange((IEnumerable)JsonConvert.Deserialize(result.Content));
公共异步静态任务GetContent(int-siteId)
{
var contentElements=新列表();
使用(HttpClient=new HttpClient())
{
client.BaseAddress=新Uri(GlobalValues.APIUri);
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
AddAuthenticationHeader(客户端);
var result=await client.GetAsync(“api/Content/GetContent/”+(object)siteId);
if(结果。IsSuccessStatusCode)
{
contentElements.AddRange((IEnumerable)result.Content.ReadAsStringAsync());
}
}
返回contentElements;
}

将方法设为异步,并像这样使用wait

使用异步的任何特定原因awaits@MrinalKamboj他不需要在这里使用wait,因为他在异步调用结束时使用的是.Result。使用.Result将像等待一样等待任务完成。我们可以看到返回JSON的示例吗?@Alok,因为异步调用结束时出现了.Result,如所述deruitda@deruitda注释中添加了Json,这并不是问题的根源。他在异步调用结束时使用了.Result,它将等待任务完成,然后再继续执行,这正是wait所做的。@deruitda不正确的
Result
不是
async wait
的直接替代品,数据的异步和同步处理之间存在巨大差异,异步处理的可伸缩性要高得多,在这种情况下,服务器上没有公开同步方法HttpContent@MrinalKamboj对,对不起,我不是故意让它听起来像他们做了同样的事情,我的意思是在功能上它会产生相同的结果。我在中添加了这两个字段,但仍然没有像以前那样工作。在问题开始之前,我有相同的类和JSON,但没有这些字段。我有Newtonsoft.JSON作为项目的一部分。你认为该库的更新可能已经开始导致该问题吗?我不确定。ReadAsAsync是.NET Framework的一部分,而不是Newtonsoft.Json。如果您有Newtonsoft.Json,您可以尝试使用它来反序列化Json。尝试改用以下方法:contentElements.AddRange((IEnumerable)JsonConvert.Deserialize(result.Content));你最后的评论很有帮助。我使用了Json.ConvertObject并使其按需要/预期工作。我现在最大的问题是为什么它停止工作了?我想总有一天我会挖掘出一个谜。。。。。这可能是.NET Framework应用程序还是.NET核心?什么版本?
 public async static Task<List<ContentElement>> GetContent(int siteId)
        {
            var contentElements = new List<ContentElement>();
            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(GlobalValues.APIUri);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                AddAuthenticationHeader(client);
                var result =await client.GetAsync("api/Content/GetContent/" + (object)siteId);
                if (result.IsSuccessStatusCode)
                {
                    contentElements.AddRange((IEnumerable<ContentElement>)result.Content.ReadAsStringAsync<List<ContentElement>>());
                }
            }
            return contentElements;
        }