繁体   English   中英

ASP.NET Web API ReadAsAsync失败,没有错误

[英]ASP.NET Web API ReadAsAsync fails with no error

我第一次涉足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也会包含预期的结果,结果是结果为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那样整洁,再加上我真的很想知道我在做错什么:)

更新的16:38BST 03/09/2012

好的,在使用Web API时,我显然缺少了一些至关重要的东西,但是我仍然不知道是什么!

现在,我尝试使用带有PUT动词的服务,并且当我使用XmlSerializer测试实体时,我的实体可以正确地序列化时,该请求使用HTTP 500失败。我检查了Fiddler发送的内容以及Web API生成的XML外观没有像XmlSerializer生成的那样。 首先,所有内容都具有“ _x003C_Name_x003E_k__BackingField”之类的名称,而不是简单的“ Name”。

我的更新中出现了怪异的“ k__BackingField”名称,导致我找到了解决方法,并且像往常一样,这非常简单。

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

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

仅此而已!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM