将KnownTypeAttribute应用于对象类型?

时间:2013-12-20 18:33:18

标签: .net wcf web-services .net-4.0 known-types

我正在尝试使用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 })。

有关如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:2)

KnownTypeAttribute用于数据合同,不是目标类型 - 由于许多原因,这实际上是不切实际的。查看应用程序的示例部分 here

根据您的情况,数据合同不知道ApiStationData类型,因此在数据合同中添加[KnownType(typeof (ApiStationData))]可以解决问题。