C# ReadAsAsync调用WebAPI时未将json重构到类
我正在调用一个WebAPI,它通过JSON从数据库返回一些内容。内容在JSON中是可见的(使用Fiddler查看),但是当我尝试将响应数据放回类中时,类中的所有值都为nullC# 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
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;
}