【问题标题】:Sharing Interfaces Between a WCF Service and Client (marked w/ ServiceContract)在 WCF 服务和客户端之间共享接口(用 ServiceContract 标记)
【发布时间】:2013-02-17 01:51:19
【问题描述】:

我正在使用 VS2010 和 .NET 4.0。

我在这里检查过 (Sharing Interfaces that are implemented in WCF Service),但不同之处在于我要完成的工作涉及一个 标记有 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 响应后,我似乎无法找到确切的答案(也许我只是没有了解所有这些以及他们的响应)。

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

谢谢。

【问题讨论】:

    标签: c# .net wcf inheritance publish-subscribe


    【解决方案1】:

    向客户端提供对“原始”服务合同接口的访问(程序集或指向 .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();
    

    【讨论】:

    • 建议 2 是正确的方法。如果我同时控制客户端和服务器,我从不使用服务引用/自动生成的代理
    • 有趣。因此,对于#2,如果我需要对服务的接口进行更改,这意味着我还必须将对接口的更改复制/复制到客户端吗?如果是这样,这似乎是引入潜在错误/错误的好方法。但是,如果这是唯一的方法,那么我想如果我想完成我所追求的,我别无选择。这些是唯一的选择吗? (不过,需要明确的是,我非常感谢对此的讨论/建议。)
    • 我认为检查/依赖服务接口/类型层次结构对于 SOA 来说不是很好的做法,因为 WCF 服务应该是可互操作的。所以我认为您可能需要为您的服务引入一些特殊的“检查/获取/验证目的”接口/方法。但是依赖客户端基本是对的。
    • 好吧,鉴于它是一个通用的发布/订阅设计,让双方都知道一个特定的通用接口是有意义的。但也许我正在阅读的文章也已关闭。任何人有任何想法:blogs.msdn.com/b/tomholl/archive/2008/05/17/…?
    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多