有没有一种方法可以从WCF主机以编程方式推送NamepaceMappings



我有一个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='UserManagement']

我也知道在客户端和服务器之间有一个公共DLL也可以解决这个问题,但我不想要求任何客户端也有附带的DLL来与服务通信。

我了解这个问题和修复程序(包括dll和编辑文件)。我想知道的是:在主机端,我能做些什么吗?这样,在visual studio中生成代理后,订阅该服务的每个客户端都不需要对该服务进行任何额外的配置?(即使用SvcUtil和使用/n:http://schemas.datacontract.org/2004/07/System.DirectoryServices,System.DirectoryServices参数不是优选选项)

我认为这只是因为某些类型"序列化不好"。尝试跨WCF传递NameValueCollection(在VS2010之前)会产生与您所看到的完全相同的错误,尽管它是可序列化的。我看到的另一个不时出现的异常是SqlException(请参阅此处)。

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

最新更新