我第一次参与ASP.NET Web API,我遇到了一个让我感到非常沮丧的问题。
我正在调用的RESTful服务返回如下数据:
<SearchResults xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Results>
<Result>
<Title>foo</Title>
</Result>
<Result>
<Title>bar</Title>
</Result>
</Results>
<NumberOfResults>2</NumberOfResults>
</SearchResults>
所以我创建了一些实体来表示这些数据:
[Serializable, DataContract(Namespace = "")]
public class SearchResults
{
public List<Result> Results { get; set; }
public int NumberOfResults { get; set; }
}
[Serializable, DataContract(Namespace = "")]
public class Result
{
public string Title { get; set; }
}
然后我试图反序列化数据:
var client = new HttpClient();
client.BaseAddress = new Uri("some uri");
var response = client.GetAsync("/some/path/").Result;
response.EnsureSuccessStatusCode();
var result = response.Content.ReadAsAsync<SearchResults>().Result;
这导致SearchResults对象的Results = null和NumberOfResults = 0,即使我知道有返回的结果,如果我检查response.Content.ReadAsStringAsync(),则XML包含预期的结果。
我转而尝试:
var serializer = new XmlSerializer(typeof(SearchResults));
var results = (SearchResults)serializer.Deserialize(response.Content.ReadAsStreamAsync().Result);
这返回了一个完全填充的SearchResults对象。
最后,我尝试实现一个简单的IFormatterLogger并将其传递给ReadAsAsync,如果我尝试读取流两次(正如预期的那样!),则会调用它,但在使用ReadAsAsync进行反序列化的标准尝试期间不会调用它。 / p>
我可以使用XmlSerializer并将其传递给它,因为它可以工作,但这看起来并不像使用ReadAsAsync一样整洁,而且我真的想知道我做错了什么:)
已更新16:38BST 03/09/2012
好吧,我在使用Web API时显然遗漏了一些至关重要的东西,但我还是不知道是什么!
我现在尝试使用PUT动词来使用服务,虽然当我使用XmlSerializer对其进行测试时,我的实体正确序列化,但是请求失败了。我检查了Fiddler发送的内容以及由Web API看起来与XmlSerializer生成的不同。首先,everthing的名称类似于“_x003C_Name_x003E_k__BackingField”,而不仅仅是“名称”。
答案 0 :(得分:0)
我的更新中奇怪的“k__BackingField”名称让我得到了解决方案,并且像往常一样非常简单。
我忘了使用DataMemberAttribute标记实体中的属性。
将它们标记出来,一切都按照我原先的预期开始工作了!
就是这样!