我是 WCF 的新手。我能够成功地为 GeoNames 服务创建客户端,但现在我正在尝试为 Yahoo GeoPlanet 做同样的事情,我似乎无法让 XML 反序列化为我的 DataContract 类型。这样做的正确方法是什么?这是我正在使用的内容:
示例 REST 响应:
<places xmlns="http://where.yahooapis.com/v1/schema.rng"
xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
yahoo:start="0" yahoo:count="247" yahoo:total="247">
<place yahoo:uri="http://where.yahooapis.com/v1/place/23424966"
xml:lang="en-US">
<woeid>23424966</woeid>
<placeTypeName code="12">Country</placeTypeName>
<name>Sao Tome and Principe</name>
</place>
<place yahoo:uri="http://where.yahooapis.com/v1/place/23424824"
xml:lang="en-US">
<woeid>23424824</woeid>
<placeTypeName code="12">Country</placeTypeName>
<name>Ghana</name>
</place>
...
</places>
合约接口和客户端:
[ServiceContract]
public interface IConsumeGeoPlanet
{
[OperationContract]
[WebGet(
UriTemplate = "countries?appid={appId}",
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare
)]
GeoPlanetResults<GeoPlanetPlace> Countries(string appId);
}
public sealed class GeoPlanetConsumer : ClientBase<IConsumeGeoPlanet>
{
public GeoPlanetResults<GeoPlanetPlace> Countries(string appId)
{
return Channel.Countries(appId);
}
}
反序列化类型:
[DataContract(Name = "places",
Namespace = "http://where.yahooapis.com/v1/schema.rng")]
public sealed class GeoPlanetResults<T> : IEnumerable<T>
{
public List<T> Items { get; set; }
public IEnumerator<T> GetEnumerator()
{
return Items.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
[DataContract]
public class GeoPlanetPlace
{
[DataMember(Name = "woeid")]
public int WoeId { get; set; }
[DataMember(Name = "placeTypeName")]
public string Type { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
}
我知道这是错误的。在我的 geonames 客户端中,我的 GeoNamesResults 类有一个[DataContract]
没有属性的属性,以及[DataMember(Name = "geonames")]
属性上的一个Items
属性。不过,这对 GeoPlanet 不起作用,我不断收到反序列化异常。我可以Countries(appId)
无例外地执行该方法的唯一方法是将 Name 和 Namespace 放在 DataContract 属性中。但是,当我这样做时,我不知道如何将结果反序列化到 Items 集合中(它为空)。
我该怎么办?