我第一次尝试使用 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 进行反序列化的标准尝试期间不会被调用。
我可以只使用 XmlSerializer 并将其传递给它,因为它可以工作,但这看起来不像使用 ReadAsAsync 那样整洁,而且我真的很想知道我做错了什么:)
2012 年 3 月 9 日英国夏令时 16:38 更新
好的,我在使用 Web API 时显然遗漏了一些至关重要的东西,但我仍然不知道是什么!
我现在尝试使用带有 PUT 动词的服务,虽然当我使用 XmlSerializer 测试它时我的实体正确序列化,但请求失败并出现 HTTP 500。我检查了 Fiddler 发送的内容,Web API 生成的 XML 看起来与 XmlSerializer 生成的完全不同。首先,所有事物都有像“_x003C_Name_x003E_k__BackingField”这样的名称,而不仅仅是“名称”。