私は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);
}
しかし、完全に正直に言うと、私は盲目的にそのタグを使用しましたそれが何をしているのか、それが私を助けるためにどのように(そして、もし)使われているのかを完全に理解することなく。
誰も私が何をすべきか考えていますか?
ありがとうございます!
あなたは '[ServiceKnownType(typeof(HashTable))]'を試しましたか?より一般的には、ここでハッシュテーブルを送信するIMOは悪い習慣です。 "既存のコード要件"は、不可能なものを動作させる魔法の杖ではありません。*より良いアイデアは*簡単な方法でそれを転送することです。 –
私は一歩踏み出し、何をしようとしているのかを説明しましょう。私たちはHTTPトンネリングをサポートしていない古いソケット・フレームワークを使用しており、Webサービス内でプロセス全体をラップしたいファイアウォールを持つユーザーはポート80でのみトラフィックを許可します。このフレームワークの要件の1つは、ハッシュテーブルを削除することです.WCFサービスを有効にすると、TCPサービスが中断されます。 – Ron
TCPサービスはバイトをサポートしています。バイトのみ。ハッシュテーブルがどのように関連しているかわからない...もしあなたが前に 'BinaryFormatter'を使用していた(btwは必ずしも安全な選択ではない)問題であれば、' DataContractSerializer'の代わりに 'NetDataContractSerializer' * ;これを設定する方法がグーグルで表示されます) –