我第一次涉足 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;
即使我知道有返回的结果,并且如果我检查 response.Content.ReadAsStringAsync(),XML 包含预期的结果,这会导致结果为 Results = null 和 NumberOfResults = 0 的 SearchResults 对象。
我改为尝试:
var serializer = new XmlSerializer(typeof(SearchResults));
var results = (SearchResults)serializer.Deserialize(response.Content.ReadAsStreamAsync().Result);
然后返回一个完全填充的 SearchResults 对象。
最后,我尝试实现一个简单的 IFormatterLogger 并将其传递给 ReadAsAsync,如果我尝试读取流两次(正如预期的那样!),它会被调用,但在使用 ReadAsAsync 进行反序列化的标准尝试期间不会被调用。
我可以只使用 XmlSerializer 并将其传递给它,因为它有效,但这似乎不像使用 ReadAsAsync 那样整洁,而且我真的很想知道我做错了什么:)
更新于 2012 年 3 月 9 日英国夏令时 16:38
好吧,我显然在使用 Web API 时遗漏了一些至关重要的东西,但我仍然不知道是什么!
我现在尝试使用 PUT 动词使用服务,虽然我的实体在使用 XmlSerializer 测试它时正确序列化,但请求因 HTTP 500 而失败。我检查了使用 Fiddler 发送的内容以及由 Fiddler 生成的 XML Web API 与 XmlSerializer 生成的 API 完全不同。首先,一切都有像“_x003C_Name_x003E_k__BackingField”这样的名称,而不是简单的“名称”。
请您参考如下方法:
我的更新中奇怪的“k__BackingField”名称让我找到了解决方案,而且像往常一样,它非常简单。
我忘记用 DataMemberAttribute 标记实体中的属性。
标记它们,一切都按照我最初的预期开始工作!
就是这样!
