我正在尝试使用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的类型。'。请参阅InnerException 了解更多详情。
看来我应该找回一个类似于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
})。
有关如何解决此问题的任何建议?
答案 0 :(得分:2)
KnownTypeAttribute
用于数据合同,不是目标类型 - 由于许多原因,这实际上是不切实际的。查看应用程序的示例部分 here 。
根据您的情况,数据合同不知道ApiStationData
类型,因此在数据合同中添加[KnownType(typeof (ApiStationData))]
可以解决问题。