我正面临着WCF和命名空间的一些问题。情况是这样的:我的webservice(我们称之为“WS-A”)应该作为另一个(更复杂的)web服务(“WS-B”)的代理。 WS-A为我们开发的应用程序公开了更简单的接口,因此它简单地“隐藏”了一些我们不想在我们的应用程序中结束的业务逻辑。我们获得了WS-B的WSDL和XSD模式,并使用svcutil将它们导入到C#中。显然它继承了WS-B的命名空间(http://ws.source.com)。对于WS-A,我们使用一些其他名称空间(http://ws.example.com)。一些数据结构必须在两个Web服务之间共享,但我无法重用相同的数据合同。 AFAIK WCF要求数据和服务合约的名称空间是“静态的”,并且不能在运行时决定。有没有办法与WCF做到这一点,或者我应该改变我的策略?在不同命名空间中共享数据合同
编辑:这里是一个例子,试图澄清我需要什么。
Namespace A V Namespace B +--------------+ | +--------------+ | | | | | Application >-------+ Webservice A +-------+ Webservice B | | | | | | +--------------+ | +--------------+
应用程序调用WS-A的操作“GiveMeData”,该操作使用名称空间A,如其WSDL中所述。响应所包含的类别“数据”,这实际上是使用命名空间B.
[DataContract(Namespace="http://namespaceB")]
public class Data {
...
}
所以响应将数据绑定到错误的命名空间从WS-B中得到的数据结构的引用。
您是否考虑将共享数据合同移动到可以在服务之间共享的独立程序集中?您可以在代码中设置命名空间 - 例如'[DataContract(Namespace =“http://some.namespace.com/”)''。 – Tim
问题是共享XSD命名空间而不是程序集命名空间之间的数据契约。我有一个对象,我想从/到/两个名称空间的序列化。 –
如果我正确理解你的问题,我会改变这种策略。您可能会从不紧密耦合的数据合同中受益。 (当你每次签订合同B时都想改变合同A?) 我会使用单独的名称空间,但可能会通过继承通用接口或类似工具来在WCF之外共享数据合同。 – Guran