0

我一直在尝试让 web 服务在我的 localhost 中工作并进行调试,但它给了我这个错误:

System.InvalidOperationException:“ParticipantDataService.Participant+OutsideAccountDetails+FundCollection”类型的 DataContract 无法添加到 DataContractSet,因为名称空间“http://schemas.datacontract”中具有相同数据合同名称“ArrayOfFundDetails”的“ParticipantDataService.Participant+FundCollection”类型。 org/2004/07/ParticipantDataService' 已经存在,并且合同不等效。

有没有人以前有这个错误?

谢谢。

下面的删节代码(注意:不是我的代码。我正在修改以前的开发人员的代码,他已经不在这里了。也是一个带有网络服务的菜鸟。在下面的这个代码块中,因为这个问题现在似乎与资金有关,我已经使所有“资金”参考文献比其他参考文献更明显。谢谢。)

Namespace COMParticipantNameSpace
<DataContract(Namespace:="XYZ", Name:="COMParticipant"),                          
KnownType(GetType(COMParticipant))> _
Public Class COMParticipant
    Inherits COMResponse

    Private _FullName As FullName
    (Other initialized variables...)

    Protected Friend Sub New...

    #Region "Properties"
    <DataMember(Name:="Name", Order:=0)>...
    <Other DataMembers...>
    #End Region

    #Region "Structures"
    Public Structure FullName...
            (Other Public Structures)
    #End Region
    #Region "Classes"
    <DataContract(Name:="ParticipantPortfolio")>....

    Public Class GroupCollection...
    End Class

    <DataContract(Name:="Group")>...
            <DataMember(Name:="Funds", Order:=6)> _
            Public Property Funds() As COMFundCollection
                Get
                    Return _Funds
                End Get
                Set(ByVal value As COMFundCollection)
                    _Funds = value
                End Set
            End Property
    End Class

    Public Class COMAccountCollection
        Inherits System.Collections.ObjectModel.Collection(Of COMAccountDetails)
    End Class

    <DataContract(Name:="COMAccountDetails")> _
    Public Class COMAccountDetails

        (Other initialized variables...)
        Private _Funds As COMFundCollection

        <DataMember Order 0,1,2,3,etc...)>...

        <DataMember(Name:="Funds", Order:=7)> _
        Public Property Funds() As COMFundCollection
            Get
                Return _Funds
            End Get
            Set(ByVal value As COMFundCollection)
                _Funds = value
            End Set
        End Property

    End Class

    Public Class COMFundCollection
        Inherits System.Collections.ObjectModel.Collection(Of COMFundDetails)
    End Class

    Public Class OutsideAccountCollection
    End Class

    <DataContract(Name:="OutsideAccountDetails")> _
        Public Class OutsideAccountDetails

        (Other initialized variables...)
        Private _Funds As FundCollection

        <Order 1, 2, 3, etc...>

        <DataMember(Name:="Funds", Order:=15)> _
        Public Property Funds() As FundCollection
            Get
                Return _Funds
            End Get
            Set(ByVal value As FundCollection)
                _Funds = value
            End Set
        End Property

        Public Class FundCollection
            Inherits System.Collections.ObjectModel.Collection(Of FundDetails)
        End Class

        <DataContract(Name:="FundDetails")>...

    End Class

    Public Class TransactionTypeCollection
        Inherits System.Collections.ObjectModel.Collection(Of TransactionTypeDetail)
    End Class
    Public Class TransactionTypeDetail...
    Public Class TransactionCollection...

    <DataContract(Name:="Transaction")> _
    Public Class Transaction

        (Other initialized variables...)
        Private _Funds As TransactionFundCollection

        <DataMember Order 1,2,3,etc ...>

        <DataMember(Name:="Funds", Order:=7)> _
        Public Property Funds() As TransactionFundCollection
            Get
                Return _Funds
            End Get
            Set(ByVal value As TransactionFundCollection)
                _Funds = value
            End Set
        End Property

    End Class
    Public Class TransactionFundCollection
        Inherits System.Collections.ObjectModel.Collection(Of TransactionFundDetails)
    End Class

    #End Region
    End Class

    End Namespace}
4

1 回答 1

0

尽管不是您问题的解决方案,但我收到了相同的错误消息。所以,我认为其他人在这里发布它是有用的。就我而言,它与链式继承有关。

我在一个名为 DerivedTypes 的基类上有一个静态方法(很像这里描述的:普遍接受的方法来避免每个派生类的 KnownType 属性),它调用一个扩展方法来确定它的继承者。

如果你有 A : B, B : C,那么 C 应该是这样的:

[DataContract]
[KnownType("DerivedTypes")]
public class C {
  internal static Type[] DerivedTypes() {
    typeof(C).GetDerivedTypes();
  }
}

调用 B.DerivedTypes() 将(错误地)获得太多类型,因为它会调用typeof(C).GetDerivedTypes(). 在我的情况下,这触发了同样的错误。

除非 B 是:

[DataContract]
[KnownType("DerivedTypes")]
public class B : C {
  internal **new** static Type[] DerivedTypes() {
    typeof(B).GetDerivedTypes();
  }
}

自然没有'**'。现在,如果遇到类型 B,B.DerivedTypes() 将不会调用其父级。由于 A 没有子类,因此不需要 KnownType 属性。

顺便说一句,我对扩展方法所做的修改是扩展方法使用类型 (so Assembly.GetAssembly(baseType)) 中的程序集,并且我将静态方法设为内部用于测试目的。私人的也应该没问题。

于 2014-10-14T14:23:30.063 回答