引用程序集中的WCF重用类型不会重用ServiceContract接口

Mat*_*att 12 wcf interface

我有四个独立的项目:

  • MyUserControl - 需要对服务实现的引用IMyService

  • MyService - 实现IMyService

  • MySharedInterfaces - 包含IMyUserControlIMyService

  • MyWebApp

用户控件需要在运行时动态加载.这实现IMyUserControl并具有IMyService将在运行时设置的类型属性.

麻烦就是重用类型的选项,MyWebApp没有重用IMyService接口.它总是从服务参考中再次生成它.如果我可以将它投射到MySharedInterfaces.IMyService我无法理解的情况下这不是问题,因为它应该完全相同.

用户控件期待某种类型IMyService.无论如何要么强制WebServiceReference.IMyService转回MySharedInterface.IMyService或强制WebServiceReference重用MySharedInterface.IMyService

mar*_*c_s 16

马特,你绝对可以自己创建客户端代理的"两步"过程 - 这真的不是一个大问题.

在您的客户端应用程序中,引用MySharedInterfaces程序集.然后,ChannelFactory<T>为您的服务接口创建一个实例:

ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>();
Run Code Online (Sandbox Code Playgroud)

这基本上创建了一个工厂类,然后能够在客户端和服务器之间创建实际的通信通道.由于它需要服务合同,因此只有在您可以共享服务合同程序集时才能使用此方法(在您的情况下,您可以这样做).

这是一个相当耗费时间和资源的步骤,因此如果可能的话,尝试将工厂存放在某处并重新使用它,而不是不断地重新创建它.

鉴于您的渠道工厂,您现在可以创建实际的沟通渠道,这基本上等同于您通过Add Service Reference以下方式生成的代理客户端:

IMyService client = factory.CreateChannel();
Run Code Online (Sandbox Code Playgroud)

这不是一个非常昂贵的操作,因此您可以在每次拨打服务电话之前执行此操作,而不必担心出现故障等信道.

client也实现了ICommunicationObject接口,所以如果你需要检查的东西WCF相关,如信道的状态,你可以施展你的客户:

CommunicationState currentState = ((ICommunicationObject)client).State;
Run Code Online (Sandbox Code Playgroud)

所以你基本上真的拥有生成的客户端代理类的所有部分,但你可以更好地控制你正在做的事情.