C# 使用多个wcf服务,factory类返回proxyclient

C# 使用多个wcf服务,factory类返回proxyclient,c#,wcf,class,factory,C#,Wcf,Class,Factory,我的应用程序中有多个服务。WebService1、WebService2、WebService3等等 所有服务都有相同的方法,但它们托管在不同的IP上 现在,当客户端调用methodA(1)时 应调用WebService1Client.Method() 客户端调用方法a(2),然后应调用WebService2Client.Method() 我不想为客户机上的每个函数都做一个切换案例 我更愿意创建一些类/方法来返回适当的proxyClient 如何创建一个类来返回该对象,以及如何使用该对象 请给我

我的应用程序中有多个服务。WebService1、WebService2、WebService3等等

所有服务都有相同的方法,但它们托管在不同的IP上

现在,当客户端调用methodA(1)时

应调用WebService1Client.Method()

客户端调用方法a(2),然后应调用WebService2Client.Method()

我不想为客户机上的每个函数都做一个切换案例

我更愿意创建一些类/方法来返回适当的proxyClient

如何创建一个类来返回该对象,以及如何使用该对象

请给我一些示例代码或参考资料


谢谢

我不太清楚您为什么要将代理的创建打包到工厂中。最简单的使用模式是在需要代理的地方和每次需要代理的时候创建代理。当您没有运行可靠的会话或其他繁重的东西时,新建代理实例不会有太多开销。另一方面,它确保您的连接正在工作,并且通道未处于故障状态

当使用代理时,您应该确保在完成时关闭它,并在它引发异常时中止它

var proxy = new Proxy();
try { proxy.SomeMethod(); }
catch { proxy.Abort(); }
finally { proxy.Close(); }

我不太清楚为什么要将代理的创建打包到工厂中。最简单的使用模式是在需要代理的地方和每次需要代理的时候创建代理。当您没有运行可靠的会话或其他繁重的东西时,新建代理实例不会有太多开销。另一方面,它确保您的连接正在工作,并且通道未处于故障状态

当使用代理时,您应该确保在完成时关闭它,并在它引发异常时中止它

var proxy = new Proxy();
try { proxy.SomeMethod(); }
catch { proxy.Abort(); }
finally { proxy.Close(); }

如果您的所有服务都实现了相同的契约(我的意思是完全相同的,而不是具有相同方法的契约),那么您可以简单地使用ChannelFactory类创建代理,并将返回的对象强制转换到契约接口中

这将为您提供预期的通用行为

确保相同接口被广泛使用的一种方法是将其放入一个单独的类库中,并在所有项目之间共享。确保将服务引用配置为重用引用程序集中的类型

编辑:这是您使用ChannelFactory的方式,您可以摆脱服务引用:

BasicHttpBinding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress("http://localhost/MathService/Ep1");
ChannelFactory<IMath> myChannelFactory = new ChannelFactory<IMath>(myBinding, myEndpoint);
BasicHttpBinding myBinding=new BasicHttpBinding();
EndpointAddress myEndpoint=新的EndpointAddress(“http://localhost/MathService/Ep1");
ChannelFactory myChannelFactory=新的ChannelFactory(myBinding,myEndpoint);

如果您的所有服务都实现了相同的契约(我指的是完全相同的契约,而不是具有相同方法的契约),您只需使用ChannelFactory类创建代理,并将返回的对象强制转换到契约接口中即可

这将为您提供预期的通用行为

确保相同接口被广泛使用的一种方法是将其放入一个单独的类库中,并在所有项目之间共享。确保将服务引用配置为重用引用程序集中的类型

编辑:这是您使用ChannelFactory的方式,您可以摆脱服务引用:

BasicHttpBinding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress("http://localhost/MathService/Ep1");
ChannelFactory<IMath> myChannelFactory = new ChannelFactory<IMath>(myBinding, myEndpoint);
BasicHttpBinding myBinding=new BasicHttpBinding();
EndpointAddress myEndpoint=新的EndpointAddress(“http://localhost/MathService/Ep1");
ChannelFactory myChannelFactory=新的ChannelFactory(myBinding,myEndpoint);

执行同一份合同是什么意思?WCF服务将基本上完全相同。除了它们托管在不同的机器上。服务如何实现相同的合同?将接口提取到类库/共享dll,然后使用该接口实现服务?这就是你的建议吗?事实上,这正是我在回答的最后一部分中建议的。谢谢Johann,你能给我指一些关于使用Factory类的示例吗。嗨,Johann,我们已经将接口提取到一个共享Dll,当创建客户端时,它的类型仍然是WebService1.ServiceCLient等等,无法将代理对象提取到类库中。我使用ChannelFactory添加了一个示例。我们的想法是在一个单独的程序集中共享DataContract和service contract,并去掉service引用。实现同一个contract是什么意思?WCF服务将基本上完全相同。除了它们托管在不同的机器上。服务如何实现相同的合同?将接口提取到类库/共享dll,然后使用该接口实现服务?这就是你的建议吗?事实上,这正是我在回答的最后一部分中建议的。谢谢Johann,你能给我指一些关于使用Factory类的示例吗。嗨,Johann,我们已经将接口提取到一个共享Dll,当创建客户端时,它的类型仍然是WebService1.ServiceCLient等等,无法将代理对象提取到类库中。我使用ChannelFactory添加了一个示例。其思想是在一个单独的程序集中共享DataContract和服务契约,并去掉服务引用。