C# 是否有一种方法可以通过编程方式从WCF主机推送NamepaceMappings?

C# 是否有一种方法可以通过编程方式从WCF主机推送NamepaceMappings?,c#,visual-studio-2010,wcf,.net-4.0,C#,Visual Studio 2010,Wcf,.net 4.0,我有一个WCF服务,需要我将以下内容添加到Reference.svcmap <NamespaceMappings> <NamespaceMapping TargetNamespace="http://schemas.datacontract.org/2004/07/System.DirectoryServices" ClrNamespace="System.DirectoryServices" /> </Namespac

我有一个WCF服务,需要我将以下内容添加到
Reference.svcmap

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

如果没有该行,则会出现以下错误:

Warning 1 Custom tool warning: Cannot import wsdl:portType Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Error: ISerializable type with data contract name 'DirectoryServicesCOMException' in namespace 'http://schemas.datacontract.org/2004/07/System.DirectoryServices' cannot be imported. The data contract namespace cannot be customized for ISerializable types and the generated namespace 'DomainManagement.Console.UserManagementProxy' does not match the required CLR namespace 'System.DirectoryServices'. Check if the required namespace has been mapped to a different data contract namespace and consider mapping it explicitly using the namespaces collection. XPath to Error Source: //wsdl:definitions[@targetNamespace='http://example.com/v1']/wsdl:portType[@name='IUserManagement'] 警告1自定义工具警告:无法导入wsdl:portType 详细信息:运行WSDL导入扩展时引发异常: System.ServiceModel.Description.DataContractSerializerMessageCompactImporter 错误:数据协定名称为“DirectoryServicesCOMException”的ISerializable类型 在名称空间中'http://schemas.datacontract.org/2004/07/System.DirectoryServices' 无法导入。无法为自定义数据协定命名空间 ISerializable类型和生成的命名空间 “DomainManagement.Console.UserManagementProxy”与所需的CLR不匹配 命名空间“System.DirectoryServices”。检查所需的命名空间是否已被删除 映射到不同的数据契约命名空间并考虑映射它 显式使用名称空间集合。 XPath到错误源: //wsdl:definitions[@targetNamespace='1]http://example.com/v1']/wsdl:portType[@name='IUserManagement'] 我也知道在客户端和服务器之间有一个公共DLL也可以解决这个问题,但我不想要求任何客户端也有附带的DLL来与服务通信


我了解问题和修复(dll和编辑文件)。我想知道的是:在主机端是否有什么可以做的,以便订阅此服务的每个客户端在VisualStudio中生成代理后不需要对服务进行任何额外配置?(即使用
SvcUtil
/n:http://schemas.datacontract.org/2004/07/System.DirectoryServices,System.DirectoryServices
参数不是首选选项)

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


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

您如何知道客户端名称空间应该是什么?@drozzy在错误文本中,它已经知道它应该映射“ISerializable type with data contract name‘DirectoryServicesCOMException’[…]无法导入。无法为ISerializable类型自定义数据协定命名空间,并且生成的命名空间“DomainManagement.Console.UserManagementProxy”与所需的CLR命名空间“System.DirectoryServices”不匹配。我只是觉得很烦人,对于我编写的每一个使用此服务的程序,我必须记住在它工作之前手动进入并将4行代码粘贴到
Reference.svcmap
。哦,天哪,这是我无法理解的!我的项目要简单得多,但我不使用svcutil(可能是因为我才刚刚开始)。我真的不认为与客户机共享合同接口有什么问题,例如:P.S.:抱歉,因为侧钻:(错误是抱怨它不知道如何序列化类型“DirectoryServicesCOMException”。您是否在服务操作中将这些类型之一作为参数或返回值传递?SqlException、解决方案有问题?更改我的服务并只接收文本!