Skip to main content
 首页 » 编程设计

c#之ASP.NET Web API ReadAsAsync 失败且没有错误

2024年01月01日38grandyang

我第一次涉足 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 标记实体中的属性。

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

就是这样!