3

WCFインターフェイスでHashSetを使用しています

[ServiceContract]
public interface IwcfServerSync
{
    [OperationContract]
    void Test(HashSet<int> someHashSet);
}

サービス参照を作成すると、HashSetはint[]に変わります。

ServiceKnownTypeを追加しました:

[ServiceKnownType(typeof(System.Collections.Generic.HashSet<int>))]

いくつかの構成を試しましたが、完全に変更することはできませんでした。

変更すると、すべてが機能するようにハードコーディングされていますが、参照を更新するたびに変更するのは本当に面倒です。

私はおそらく何か間違ったことをしている、何か指針やアイデアはありますか?

4

1 に答える 1

4

コレクションは、ネットワークを通過するときに単純化されます。IDE およびコマンドライン ( ) を介してコレクション タイプを指定できますが、API のすべてのsvcutil /collectionTypeコレクションに適用されます。それを受け入れて、コードで不一致を処理する必要があると思います。最終的に、ネットワーク上では、コレクションは単なる xml です (少なくとも標準のバインディングでは) - 次のようなものです。

<items>
   <item ...>...</item>
   <item ...>...</item>
   <item ...>...</item>
</items>

T[]- したがって、配列 ( )、 a List<T>、 a HashSet<T>、および aの間で (スキーマから) 判断できない理由MyFunkyCollection<T>

アセンブリ共有を使用する場合 (つまり、同じサービス コントラクト アセンブリがクライアントサーバーにある場合)、これは発生しませんが、SOA/mex の意図に反することに注意してください。しかし、これはかなり頻繁に使用されるアプローチです。したがって、IDE は直接サポートしており、スイッチ ( svcutil /reference) を介したコマンドラインもサポートしています。


それをサポートする IDE の場合... サービス コントラクトとデータ コントラクトをクラス ライブラリ (dll) に記述し、アセンブリ参照 (つまり、dll 参照またはプロジェクト参照) を 2 つのプロジェクト (サーバー プロジェクトとクライアント プロジェクト)。ここで、クライアント プロジェクトからサーバー エンドポイント (.svc) へのサービス参照を追加します。VS2008 を使用している場合、型のローカル参照が自動的にチェックされ、プロキシ生成の代わりにそれらが使用されます。つまり、クライアント コードは、使用するIwcfServerSyncかどうかを既に認識しているクラス ライブラリの を使用しますHashSet<T>

于 2009-05-10T09:24:18.563 に答える