【发布时间】:2013-12-20 18:33:17
【问题描述】:
我正在尝试使用 WeatherBug API(WSDL 是 here)。我正在尝试学习一些关于 WCF 的知识。
我使用 svcutil.exe 从上面链接中的 WSDL 创建类。
然后我尝试执行以下代码来测试它:
var proxy = new WeatherBugWebServicesSoapClient();
var stations = proxy.GetStationListByUSZipCode("97211", UnitType.English, "myapikey");
我最终得到了NetDispatcherFaultException:
格式化程序在尝试反序列化 消息:尝试反序列化参数时出错 http://api.wxbug.net/:GetStationListByUSZipCodeResponse。这 InnerException 消息是“第 1 行位置 352 中的错误。元素 'http://api.wxbug.net/:anyType' 包含来自映射到的类型的数据 名称“http://api.wxbug.net/:ApiStationData”。解串器有 不知道映射到此名称的任何类型。考虑使用一个 DataContractResolver 或添加 'ApiStationData' 对应的类型 到已知类型的列表 - 例如,通过使用 KnownTypeAttribute 属性或通过将其添加到已知列表中 传递给 DataContractSerializer 的类型。'。请参阅内部异常 了解更多详情。
看来我应该取回一个 ArrayOfAnyType 类型的对象,它是这样声明的(由 svcutil.exe 生成):
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.CollectionDataContractAttribute(Name = "ArrayOfAnyType", Namespace = "http://api.wxbug.net/", ItemName = "anyType")]
public class ArrayOfAnyType : System.Collections.Generic.List<object> {
}
数组看起来应该是ApiStationData 的集合,声明如下:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name = "ApiStationData", Namespace = "http://api.wxbug.net/")]
public partial class ApiStationData : object, System.Runtime.Serialization.IExtensibleDataObject {
根据我在各种网页上阅读的内容,我认为我需要将KnownTypeAttribute 添加到Object 类,因为ArrayOfAnyType 是List<object>。我不认为这是可能的,虽然(或正确的)......
异常提到http://api.wxbug.net/:anyType 也很奇怪,但在 svcutil 生成的代码中没有anyType 的定义(这就是我假设ArrayOfAnyType 的原因)。
关于如何解决这个问题的任何建议?
【问题讨论】:
标签: .net wcf web-services .net-4.0 known-types