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 和编辑文件)。我想知道的是:在主机端有什么我可以做的,所以每个订阅此服务的客户端在 Visual Studio 中生成代理后不需要对服务进行任何额外的配置?(即使用SvcUtil和使用/n:http://schemas.datacontract.org/2004/07/System.DirectoryServices,System.DirectoryServices参数不是首选选项)

4

1 回答 1

2

我认为这仅仅是因为某些类型“不能很好地序列化”。尝试跨 WCF 传递 NameValueCollection(在 VS2010 之前)会产生与您看到的完全相同的错误,尽管它是可序列化的。我不时看到的另一个是 SqlException(请参见此处)。

唉,我不知道有任何服务器端解决方案。我发现为客户端提供“服务接口”DLL 是最简洁的方法 - 它避免了通过 svcutil/add 服务引用生成客户端代码,但您似乎有理由不这样做。另一种方法是重构您的服务器端代码以避免传递DirectoryServicesCOMException. 您可以尝试谷歌搜索“NameValueCollection WCF 序列化”问题,看看当时是否有任何建议的解决方法可能适用于您的方案。我怀疑不是,因为这是由它在内部实现某些接口的方式引起的。

于 2012-10-15T10:29:12.263 回答