2

我在 WCF 服务中有一个方法,它返回一个复杂类型 (myComplexResult),其中包括一个列表 (Of Common.myBaseClass) 作为其成员之一。我希望这个列表包含不同类型的 Foo.myClass1 和 Bar.myClass2 的项目,它们都继承自 Common.myBaseClass。请注意,所有这些类都在不同的程序集中定义。

该服务抛出此异常:

不应使用数据合同名称“myClass1: http://mynamespace/foo/ ”键入“Foo.myClass1” 。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。

好的,所以我意识到我需要将 myClass1 和 myClass2 声明为 myBaseClass 的已知类型,以便 DataContractSerializer 知道如何处理它们。我不能做显而易见的事情并使用 myClass1 和 myClass2 的 KnownType 属性来装饰 myBaseClass 类,因为这意味着添加对 Foo 和 Bar 程序集的引用,这会导致循环依赖。

我希望在我的配置文件中使用 declareTypes 并且我尝试了这个:

<system.runtime.serialization >
    <dataContractSerializer >
        <declaredTypes >
            <add type ="Common.myBaseClass, Common">
                <knownType type ="Foo.myClass1, Foo" />
                <knownType type ="Bar.myClass2, Bar" />
            </add>
        </declaredTypes>
    </dataContractSerializer>
</system.runtime.serialization>

这似乎没有帮助,所以我尝试将 KnownType 属性添加到 myComplexResult:

  <DataContract(name:="myComplexResult", [namespace]:="http://mynamespace/coo/")> _
    <KnownType(GetType(Foo.myClass1))> _
    Public Class myComplexResult
        <DataMember(name:="myList")> _
        Public myList As List(Of Common.myBaseClass)

但我仍然遇到同样的错误。帮助!我该怎么办?

4

1 回答 1

3

我的错。我已经重新尝试过,我上面发布的两个解决方案实际上都有效。我认为这是在运行测试之前根本没有更新我的测试项目上的服务引用的情况 - 哎呀!!!

于 2009-06-12T12:43:46.593 回答