2012-05-11 3 views
0

私はDictionary<byte, object>を含むbasicHttpBindingを介してWCF経由でクラスを送信しようとしています。その内部にはHashtableがあります。これは既存のコード要件のために必要とされ、変更できません。WCFの辞書内にハッシュテーブルを送り返す

今、私はちょうどDictionary<byte, object>でクラスを送信したりHashtableあれば、それは魔法のように動作しますが、私はハッシュテーブルを含む辞書を送信するとき、私は次のようなエラーメッセージが出ます:

をエラーが発生しましたパラメータ http://tempuri.org/:UpdateResultをシリアル化しようとしています。 InnerExceptionメッセージが ' ' System.Collections.Hashtable 'で、データコントラクト名が ' ArrayOfKeyValueOfanyTypeanyType:http://schemas.microsoft.com/2003/10/Serialization/Arrays ' であるとは限りません。 DataContractResolverを使用するか、または既知のタイプのリストに静的に知られていないタイプの を追加することを検討してください。たとえば、 KnownTypeAttribute属性を使用するか、DataContractSerializerに渡された既知のタイプのリストに追加します。詳細については、 InnerExceptionを参照してください。

は今、私もすべて「サービス知られているタイプは」運で、私のサービス・インターフェースに属性を追加しようとしました:

[ServiceContract] 
    public interface IServerProxy 
    { 
     [OperationContract] 
     bool Connect(long FBUID, string SecretKey); 

     [OperationContract] 
     [ServiceKnownType(typeof(IDictionary<byte, Hashtable>))] 
     [ServiceKnownType(typeof(IDictionary<Hashtable, Hashtable>))] 
     [ServiceKnownType(typeof(IDictionary<object, object>))] 
     [ServiceKnownType(typeof(IDictionary<object, IDictionary<object, object>>))] 
     List<QueuedMessage> Update(long FBUID, string SecretKey); 
    } 

しかし、完全に正直に言うと、私は盲目的にそのタグを使用しましたそれが何をしているのか、それが私を助けるためにどのように(そして、もし)使われているのかを完全に理解することなく。

誰も私が何をすべきか考えていますか?

ありがとうございます!

+0

あなたは '[ServiceKnownType(typeof(HashTable))]'を試しましたか?より一般的には、ここでハッシュテーブルを送信するIMOは悪い習慣です。 "既存のコード要件"は、不可能なものを動作させる魔法の杖ではありません。*より良いアイデアは*簡単な方法でそれを転送することです。 –

+0

私は一歩踏み出し、何をしようとしているのかを説明しましょう。私たちはHTTPトンネリングをサポートしていない古いソケット・フレームワークを使用しており、Webサービス内でプロセス全体をラップしたいファイアウォールを持つユーザーはポート80でのみトラフィックを許可します。このフレームワークの要件の1つは、ハッシュテーブルを削除することです.WCFサービスを有効にすると、TCPサービスが中断されます。 – Ron

+0

TCPサービスはバイトをサポートしています。バイトのみ。ハッシュテーブルがどのように関連しているかわからない...もしあなたが前に 'BinaryFormatter'を使用していた(btwは必ずしも安全な選択ではない)問題であれば、' DataContractSerializer'の代わりに 'NetDataContractSerializer' * ;これを設定する方法がグーグルで表示されます) –

答えて

1

wcfのジェネリックについては、my answerを参照してください。 SOAの状況ではジェネリックは不可能です。 This questionは、代替解決策を提案している。これが役に立ったら

関連する問題