Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF服务设计_Wcf - Fatal编程技术网

WCF服务设计

WCF服务设计,wcf,Wcf,我们目前有一个WCF服务,它的性能已经开始达到极限 我们决定添加另一台服务器,它将承载WCF服务的另一个实例 我们的web应用程序必须基于上下文与特定服务器通信。。。e、 g.如果web应用程序正在处理来自ServiceInstance1的对象,则请求必须定向到ServiceInstance1的端点。如果web应用程序正在处理来自ServiceInstance2的对象,则请求必须定向到ServiceInstance2的端点 我最初认为可以创建“中间服务”或“服务管理器”,web应用程序的服务引用

我们目前有一个WCF服务,它的性能已经开始达到极限

我们决定添加另一台服务器,它将承载WCF服务的另一个实例

我们的web应用程序必须基于上下文与特定服务器通信。。。e、 g.如果web应用程序正在处理来自ServiceInstance1的对象,则请求必须定向到ServiceInstance1的端点。如果web应用程序正在处理来自ServiceInstance2的对象,则请求必须定向到ServiceInstance2的端点

我最初认为可以创建“中间服务”或“服务管理器”,web应用程序的服务引用将从单个服务实例更新为“中间服务”或“服务管理器”,并且所述服务将充当各个服务实例的“代理”

这是如何实现的

目前,我已从管理者处为每个服务添加了ServiceReference,但似乎一旦服务被“引用”,它的类型就变得特定于ServiceReference的类型,例如

ServiceInstance1的类型都是{ServiceInstance1}。 ServiceInstance2的类型都是{ServiceInstance2}

我需要在web应用程序端使用相同的类型,因此这显然是错误的做法

我还希望在引用“中间服务”或“服务管理器”生成的客户机上调用方法时,调用正确的服务实例,例如

IServiceManager.GetProjectById( {GUID} ) ->
返回到ServiceManager-> 确定哪个主机拥有该项目,并从正确的ServiceInstance返回ProjectObject

其中ProjectObject是ServiceInstance1和ServiceInstance2中定义的类型

我认为原始服务需要拉出一些DLL,以便可以从web应用程序端和ServiceManager引用它们,并创建一个GenericWCF客户端


如果我是正确的万岁,如果有人能为我指出正确的方向,我将不胜感激。如果我错了,请有人责骂我,告诉我这是怎么做的

完成您要做的事情的最简单方法是停止使用服务器托管的服务URL生成代理。相反,在本地从*.xsd和*.wsdl生成代理,只需更改端点的URL即可。或者,您可以使用
ChannelFactory
动态生成代理,并在客户端引用interface.dll

完成后,可以使用任何常见的Web服务器负载平衡技术来平衡服务器之间的负载


不要说得太过分,但VisualStudio的“服务参考”对您开发的服务没有用处,也不应该使用。它只对外部开发的服务有用,这些服务的URL和合同可能永远不会更改。我个人从来没有机会使用它。对于您自己的服务,您可能应该使用
ChannelFactory
或基于
ClientBase
的类来计算代理。

解决问题的方法是使用两个服务使用的类型创建共享程序集。在使用您的服务(管理器)的客户端上引用此程序集,并在通过添加服务引用标记创建代理时从引用的程序集重用类型


您正在构建的是非常简单的消息路由器。在WCF 4.0中有对的额外支持,因此在开发自己的功能之前,您应该检查这些功能。对于WCF 3.5 MSDN杂志,包含有关构建消息路由器的文章-

为了回答这个问题并结束它,我使用了.Net 4.0中的路由策略和自定义客户机类,该类是根据代理生成的类建模的

在定制客户机准备就绪之前,我使用了自动生成的客户机代码,并从中派生了一个类,该类允许我更改它连接到的服务。我通过在所有序列化的服务对象上提供的属性确定了哪个服务

长话短说,这是100%的工作预期,包括ServiceManager,它甚至可以绕过某些调用,我们允许

我们甚至可以在运行时将项目从一个服务器移动到另一个服务器


感谢所有帮助过我的人!(尤其是我自己,因为我实际上是在没有被填鸭式地进行工作)

使用“添加服务引用”但在运行时根据需要更改URL有什么错。因为我们希望多个后端服务器对使用服务的web应用程序是透明的。通过这种方式,所有web应用程序都有相同的代码库,而不需要与哪个服务器进行通信。。。我想应该是这样的。我将回顾邮件路由的内容并选择我的位置。再次感谢您的输入。使用路由策略,您只能将扩展限制从后端服务器转移到路由服务器。它还增加了一个您必须购买、维护和保护的服务器。一个可靠的负载平衡策略将使您走得更远、更快。