2

在 Visual Studio 中添加对 Web 服务(这都是 WCF)的服务引用会生成一些生成的代码,包括正在公开的接口的客户端重述。

我理解为什么会生成这个接口:您可能正在使用 3rd 方服务并且无法访问实际接口。

但是我这样做了,即使透明代理确实确实实现了我想要转换的接口,两者也不是分配兼容的。

我可以使用反射,但这很难看。有什么方法可以打败这种虚假类型安全性并将元数据注入到,以便我可以使用类的接口?


我的具体问题以复杂的方式偏离了规范,这与单个客户端有关,该客户端直接使用基类的某些衍生物并通过服务引用远程使用其他的。每个服务器的基类都需要在集合中保留对订阅客户端的引用,以便枚举通知事件,并且由于使用代理,问题是类型不同的。

这些答案都不能解决我的具体问题,但每一个答案都具有指导意义和帮助。我找到了自己的解决方案(使用双重绑定),但如果您没有从根本上提高我对整个业务的理解,我永远不会想出来。

三个优秀的答案。如何只选择一个?我选择第一个,因为它直接解决了我最初认为的问题。

4

3 回答 3

4

如果您已经在客户端拥有合约 dll,您甚至不需要服务引用(除非您使用它来为您编写设置代码) - 您可以简单地继承 ClientBase 并公开 Channel,并直接使用它 -类似的东西(没有IDE方便......):

public class WcfClient<T> : ClientBase<T> where T : class
{
    public new T Channel {get {return base.Channel;}}
}

然后,您可以执行以下操作:

using(var client = new WcfClient<IFoo>())
{
    client.Channel.Bar(); // defined by IFoo
}

您仍然需要配置中的配置设置来确定地址、绑定等 - 但没有代理生成那么混乱。此外,您可能会选择重新实现IDipsoable以处理 WCF 代理可以投入的事实Dispose()(这很糟糕):

public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
    public new T Channel {get {return base.Channel;}}
    void IDisposable.Dispose() {
        try {
           switch(State) {
              case CommunicationState.Open: Close(); break;
              // etc
           }
        } catch {} // swallow it down (perhaps log it first)
    }
}
于 2009-01-31T09:41:32.950 回答
2

添加服务引用时,请转到“高级”并确保选中“在引用的程序集中重用类型”并选择包含您的接口定义的程序集。您也可以通过右键单击现有服务引用并转到“配置”来执行此操作。

于 2009-01-31T09:29:49.400 回答
1

为了从服务返回接口,您需要使用 KnownType 属性:

这些有帮助吗?

于 2009-01-31T08:59:31.910 回答