2

以下を追加する必要があるWCFサービスがありますReference.svcmap

<NamespaceMappings>
  <NamespaceMapping TargetNamespace="http://schemas.datacontract.org/2004/07/System.DirectoryServices" 
                    ClrNamespace="System.DirectoryServices" />
</NamespaceMappings>

その行がない場合、次のエラーが表示されます。

警告 1 カスタム ツールの警告: wsdl:portType をインポートできません
詳細: WSDL インポート拡張機能の実行中に例外がスローされました:
 System.ServiceModel.Description.DataContractSerializerMessageContractImporter
エラー: データ コントラクト名 'DirectoryServicesCOMException' を持つ ISerializable 型
  名前空間 'http://schemas.datacontract.org/2004/07/System.DirectoryServices' で
  インポートできません。データ コントラクト名前空間はカスタマイズできません
  ISerializable 型と生成された名前空間
  「DomainManagement.Console.UserManagementProxy」が必要な CLR と一致しません
  名前空間「System.DirectoryServices」。必要な名前空間が設定されているかどうかを確認します
  別のデータ コントラクト名前空間にマップされ、それをマップすることを検討してください
  名前空間コレクションを明示的に使用します。
エラー ソースへの XPath:
 //wsdl:definitions[@targetNamespace='http://example.com/v1']/wsdl:portType[@name='IUserManagement']

また、クライアントとサーバー間で共通の DLL を使用することで問題が解決することもわかっていますが、サービスと通信するためにクライアントに付属の DLL も要求する必要はありません。

問題と修正 (dll とファイルの編集の両方) を理解しています。私が知りたいのは、このサービスにサブスクライブするすべてのクライアントがビジュアルスタジオでプロキシを生成した後にサービスの追加構成を必要としないように、ホスト側でできることはありますか? (つまりSvcUtil、パラメーターの使用と使用は/n:http://schemas.datacontract.org/2004/07/System.DirectoryServices,System.DirectoryServices推奨オプションではありません)

4

1 に答える 1

2

これは単に、一部の型が「うまくシリアライズできない」という事実によるものだと思います。NameValueCollection を WCF (VS2010 より前) に渡そうとすると、シリアル化可能であるにもかかわらず、表示されているものとまったく同じエラーが発生しました。私が時々見たもう 1 つの例外は、SqlException (こちらを参照) です。

悲しいかな、私はサーバー側のソリューションを認識していません。クライアントに「サービスインターフェイス」DLLを提供することが最もクリーンなアプローチであることがわかりました-svcutil/addサービス参照を介してクライアント側のコードを生成する必要がなくなりますが、これを行わない理由があるようです. 別の方法は、サーバー側のコードをリファクタリングして、DirectoryServicesCOMException. 「NameValueCollection WCF シリアライゼーション」の問題をグーグル検索して、当時から提案されている回避策のいずれかがシナリオに適用できるかどうかを確認できます。これは、特定のインターフェースを内部的に実装する方法が原因だったので、そうではないと思います。

于 2012-10-15T10:29:12.263 に答える