在不同的名称空间之间共享数据协定

时间:2016-06-21 08:05:23

标签: c# wcf soap

我遇到了WCF和命名空间的一些问题。情况就是这样:我的网络服务(让我们称之为#34; WS-A")应该作为另一个(更复杂的)网络服务的代理(" WS-B") 。 WS-A为我们开发的应用程序提供了更简单的接口,因此它简单地隐藏了#34;一些我们不想在我们的应用程序中结束的业务逻辑。我们获得了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 |
                               |              |   |   |              |
                               +--------------+   |   +--------------+

应用程序调用操作" GiveMeData" WS-A使用名称空间A,如WSDL中所述。响应包含对类"数据"的引用。这实际上是从使用命名空间B的WS-B获得的数据结构。

[DataContract(Namespace="http://namespaceB")]
public class Data {
...    
}

因此,响应会将Data绑定到错误的命名空间。

1 个答案:

答案 0 :(得分:2)

所以你想减少系统中重复代码的数量,并且可能会跳过一些看似毫无意义的对象深层复制操作?

对这个问题的评论表明这是一个坏主意,我同意。当您或后端Web服务需要更改合同时,即使只是一点点,您也无法或者最终会得到两个数据联系类。

相反,您应该保留两个POCO类定义,即使它们在结构上是相同的,并使用http://automapper.org之类的东西管理克隆/复制过程。这样,您可以利用映射器中的某些转换缓存,并保持代码清洁。

如果您坚持在代理服务的两端使用相同的POCO,您可能只想使用后端POCO进行编码。但是,在序列化响应之后(在它进入连线之前)和反序列化请求之前(在它变成POCO之前)你需要在WCF管道中操纵消息。前者有点像黑客。你可以想到它就像在命名空间上使用正则表达式替换来从响应中编辑信息一样。当您控制序列化流的响应时,这并不太难。但是您不能控制发送到您的代理服务的内容,因此正则表达式操纵请求将会比较复杂,而且非常容易出错。请看一下WCF自定义消息编码器的示例:https://social.msdn.microsoft.com/Forums/en-US/0da33309-ec07-47d6-8ddb-15290a80977f/wcf-hook-in-after-serialization?forum=wcf

该答案的作者还有一些关于这个主题的博客文章有不同的方法。最重要的是,实现你的欲望的代码变得非常奇怪,非常快。