【问题标题】:Apply KnownTypeAttribute to Object type?将 KnownTypeAttribute 应用于对象类型?
【发布时间】:2013-12-20 18:33:17
【问题描述】:

我正在尝试使用 Wea​​therBug 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 类,因为ArrayOfAnyTypeList&lt;object&gt;。我不认为这是可能的,虽然(或正确的)......

异常提到http://api.wxbug.net/:anyType 也很奇怪,但在 svcutil 生成的代码中没有anyType 的定义(这就是我假设ArrayOfAnyType 的原因)。

关于如何解决这个问题的任何建议?

【问题讨论】:

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


    【解决方案1】:

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

    从您的情况来看,数据合约不知道ApiStationData 类型,因此将[KnownType(typeof (ApiStationData))] 添加到您的数据合约应该可以解决问题。

    【讨论】:

    • 我仍然不清楚应该在哪里应用KnownType。该示例显示它应用于祖先,但ApiStationData 的祖先是对象。 svctool 生成的几乎所有的类都有DataContactAttribute,所以当你说它应该被添加到数据契约时,你到底是什么意思?
    • 它应该是包含ArrayOfAnyType 属性的那个,或者我认为它也可能是ArrayOfAnyType 本身。
    • 工作就像一个魅力。我实际上以为我已经尝试过了,但我显然没有。谢谢您的帮助。下一个我可能会在某个时候弄清楚的问题是为什么 WSDL 没有足够的信息让 svctool 确定它是需要的,或者为什么 svctool 不够聪明而无法弄清楚。或者,它只是 WCF 的东西,不适用于其他语言...更多要学习,这很有趣:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2019-09-24
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多