我正在尝试使用WeatherBug API(WSDL在此处)。我正在尝试学习有关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
课程中添加a ,因为ArrayOfAnyType
a是List<object>
。我认为这是不可能的,但是(或正确的)...
提到异常也很奇怪http://api.wxbug.net/:anyType
,但是anyType
svcutil生成的代码中没有定义(这就是为什么我对进行假设的原因ArrayOfAnyType
)。
有关如何解决此问题的任何建议?
KnownTypeAttribute
用于数据约定而不是目标类型-由于许多原因,这实际上是不切实际的。在此处查看“示例”部分中的应用程序。
从您的情况看来,数据合同不知道ApiStationData
类型,因此将[KnownType(typeof (ApiStationData))]
数据合同添加到数据合同中即可解决该问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句