2

我第一次尝试使用 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”这样的名称,而不仅仅是“名称”。

4

1 回答 1

0

我的更新中奇怪的“k__BackingField”名称使我找到了解决方案,而且像往常一样,这很简单。

我忘记用 DataMemberAttribute 标记实体中的属性。

标记它们,这一切都开始按照我最初的预期工作!

就是这样!

于 2012-09-03T15:50:57.023 回答