【问题标题】:Is there a way to push NamepaceMappings programmatically from the WCF host?有没有办法以编程方式从 WCF 主机推送 NamepaceMappings?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 遇到 SqlException 问题,解决办法?更改我的服务并只接收文本!
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2012-03-16
相关资源
最近更新 更多