1

WCF サービスに渡そうとしているカスタム DTO のリストがあります。

次のエラーが表示されます。

パラメータ tcp://localhost/:oObject をシリアライズしようとしてエラーが発生しました。InnerException メッセージは、「Type 'System.Collections.Generic.List`1[[TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat.HeartBeatDTO, WFCommon, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]」で、データが含まれていましたコントラクト名 'ArrayOfHeartBeatDTO:TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat' は想定されていません。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加することにより、静的に認識されていない型を既知の型のリストに追加します。詳細については、InnerException を参照してください。

DTO DataContract と DataMember が設定されています。自動 WCF サービス参照を行い、コレクションを配列ではなく汎用リストに変更するための高度なオプションを確実に実行しました。

私は何が欠けていますか?同様のことを行う多くのサイトを通過しましたが、このエラーを超えて動作させることはできません。何か案は?

送信者からのコード:

<DataContract(Name:="HeartBeatDTO", Namespace:="TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat")> _
Public Class HeartBeatDTO

Public Sub IssuePatientReport()
  SBClient.SendCommunication(_PatientID, _HeartBeats)
End Sub

受信側のコード:

Public Sub SendCommunication(ByVal sKey As String, ByVal oObject As Object) Implements iOperatorCommunication.SendCommunication
        If _CurrentCommunicationLog.ContainsKey(sKey) Then
            _CurrentCommunicationLog.Item(sKey) = oObject
        Else
            _CurrentCommunicationLog.Add(sKey, oObject)
        End If
    End Sub

私のインターフェース:

<ServiceContract(Namespace:="tcp://localhost/")> _
<ServiceKnownType(GetType(List(Of HeartBeatDTO)))> _
Public Interface iOperatorCommunication
    <OperationContract()> _
    Function ReceiveCommunication(ByVal sKey As String) As Object

    <OperationContract()> _
    Function ReturnCommunicationLevel() As Integer

    <OperationContract()> _
    Function ReturnCommunications() As Dictionary(Of String, Object)

    <OperationContract()> _
    Function ReturnCommunicationsByKeySearch(ByVal sSearch As String) As Dictionary(Of String, Object)

    <OperationContract()> _
    Sub SendCommunication(ByVal sKey As String, ByVal oObject As Object)
End Interface

更新: 新しいエラー メッセージは次のとおりです。

パラメータ tcp://localhost/:oObject をシリアライズしようとしてエラーが発生しました。InnerException メッセージは、「Type 'TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat.HeartBeatDTOList」で、データ コントラクト名は「HeartBeatDTOList:TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat」ではありません。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加することにより、静的に認識されていない型を既知の型のリストに追加します。詳細については、InnerException を参照してください。

4

1 に答える 1

6

カスタムコレクションタイプがある場合は、それらを特別な属性で装飾する必要がある場合があります。CollectionDataContractのMSDNドキュメントを参照してください。

[CollectionDataContract] 
public class CustomerList2 : Collection<string> {}

それが問題でしょうか?


更新:わかりました、インターフェースを投稿していただきありがとうございます。私はVB.NETの専門家ではありませんが、私が理解していることから、OperationContract属性で装飾されたメソッドで「HeartbeatDTO」タイプを実際に使用することはありません。

したがって、おそらくそれを「ServiceKnownType」として定義する必要があると思います-これを試してください:

<ServiceContract(Namespace:="tcp://localhost/")> _
<ServiceKnownType(GetType(HeartBeatDTO))> _
<ServiceKnownType(GetType(List(Of HeartBeatDTO)))> _
Public Interface iOperatorCommunication

それは役に立ちますか?

また、サービス契約全体でタイプとして「オブジェクト」を使用している特別な理由はありますか?どちらかを指定できませんでしたHeartbeatDTOList(Of HeartbeatDTO)

更新:おそらく、それが機能するかどうかを確認するために、新しいサービスインターフェイスリストを作成してみてください。

<ServiceContract(Namespace:="tcp://localhost/")> _
Public Interface iOperatorCommunicationStripped
    <OperationContract()> _
    Sub SendCommunication(ByVal sKey As String, ByVal oObject As List(Of HeartbeatDTO))
End Interface

この場合、サービス操作はそのデータ型について明示的であり、データコントラクトとして定義されているHeartbeatDTOオブジェクトのリストを使用します。このサービスコントラクトのクライアントプロキシを作成し、メソッドを呼び出すことがわかっている場合、これは機能しますか?

マーク

于 2009-10-09T17:24:38.537 に答える