【发布时间】:2012-09-13 22:14:45
【问题描述】:
我有一个 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 参数不是首选)
【问题讨论】:
-
你怎么知道客户端命名空间应该是什么?
-
@drozzy 在错误的文本中它已经知道它应该在哪里映射“ISerializable type with data contract name 'DirectoryServicesCOMException' [...] 无法导入。数据合约命名空间无法为 ISerializable 类型自定义,并且生成的命名空间“DomainManagement.Console.UserManagementProxy”与所需的 CLR 命名空间“System.DirectoryServices”不匹配”。我只是觉得烦人的是,对于我编写的每个使用该服务的程序,我必须记住在它工作之前手动进入并将 4 行代码粘贴到
Reference.svcmap。 -
天哪,这超出了我的理解!我的项目要简单得多,但我不使用 svcutil(可能是因为我刚刚开始)。尽管在与客户共享合同接口时我真的没有看到问题,例如:dnrtv.com/default.aspx?showNum=122 P.S.:抱歉绕道:(
-
错误是抱怨它不知道如何序列化类型“DirectoryServicesCOMException”。您是否在服务操作中将其中一种类型作为参数或返回值传递?
标签: c# visual-studio-2010 wcf .net-4.0