4

我正在使用 VS2010 和 .NET 4.0。

我在这里检查过(在 WCF 服务中实现的共享接口),但不同之处在于我要完成的工作涉及一个ServiceContract 标记的接口。

即在服务中,我有一个接口A(标记为ServiceContract)和一个扩展接口B(也标记为ServiceContract)。B 由 WCF 服务实现。

确切的扩展是这样的:

public interface A<T>

public interface B : A<SpecificType>

(“SpecificType”被标记为 DataContract。)

显然,B 在代理生成过程中暴露给了 WCF 客户端;但是,我还需要公开接口 A(我正在实现一个半通用的发布/订阅系统,并且“发布者”需要能够检查/依赖接口 A)。

我尝试解决此问题的第一种方法是创建一个单独的“共享”程序集,该程序集包含接口并且可供服务和客户端使用;但是,这最终效果不佳,因为在发布者中,它需要确保 B 的实例实际上是从 A 正确扩展的。这种隐式转换失败,可能是因为服务引用似乎并不完全与“共享”程序集一起工作。

为了解决这个问题,我手动编辑了 Reference.cs 文件,它最终工作了(我添加了接口 A 的定义并确保接口 B 正确引用它)。但这会带来一个很大的问题,因为每次我更新服务引用时,这段代码都会被删除。

在查看了此站点和其他站点上的其他 WCF 响应后,我似乎无法找到确切的答案(也许我只是没有通过所有这些和他们的响应)。

如果有人能指出我正确的方向,我将不胜感激。

谢谢。

4

1 回答 1

3

向客户端提供对“原始”服务合同接口的访问(程序集或指向 .cs 文件的链接)。然后你有两个选择:

1)将自动生成的代理调用包装到您自己的类方法调用中(根据需要实现接口)。服务参考更新不会伤害您。

2)不要使用自动生成的代理。创建您自己的代理(实现您的接口):

var baseAddress = "net.tcp://localhost:4503/MyService"; 
var channelFactory = new DuplexChannelFactory<IMyService>(new InstanceContext(new MyNotificationReceiver()), //MyNotificationReceiver - WCF callback implementation class
    myNetTcpBinding,
    new EndpointAddress(baseAddress));

var proxy = channelFactory.CreateChannel();
proxy.MyMethod();
于 2013-03-03T17:45:15.717 回答