2010-08-24 68 views
0

我们目前有一个WCF服务,它开始达到它的极限性能明智。WCF服务设计

我们决定添加另一台服务器,它将托管WCF服务的另一个实例。我们有网络应用程序,它们必须根据上下文...与特定的服务器进行通信。如果Web应用程序正在处理来自ServiceInstance1的对象,则请求必须定向到ServiceInstance1的EndPoint。如果Web应用程序正在处理ServiceInstance2中的对象,则请求必须定向到ServiceInstance2的EndPoint。

我最初认为可以创建“中间服务”或“服务管理器”,Web应用程序的服务参考将从单个服务实例更新到“中间服务”或“服务管理器”,并且所述服务将会充当各种服务实例的“经纪人”。

这是如何完成的?

我目前在Manager中添加了一个ServiceReference给每个服务,但是看起来一旦服务被“引用”,它的类型就变得特定于ServiceReference的类型,例如

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

我需要类型在Web应用程序端是相同的,所以这显然是错误的方式来做到这一点。

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

IServiceManager.GetProjectById({GUID}) -> 

回来的ServiceManager - > 决定哪台主机有该项目,并从正确的服务实例返回ProjectObject。

其中ProjectObject是一个类型定义在ServiceInstance1和ServiceInstance2中。

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

如果我是对的hooray对我如果有人能指出我在正确的方向,我将不胜感激。如果我错了,有人可以责骂我,告诉我这是如何正确完成的!

+1

使用路由策略,你只会将你的扩展限制从后端服务器转移到路由服务器。它还增加了一个你必须购买,维护,安全的服务器。一个稳定的负载平衡策略会让你更快,更快。 – Mark 2010-08-27 16:24:34

回答

1

只是为了回答这个问题并关闭它,我利用.Net 4.0中的路由策略和自定义的客户端类,我在代理生成的类之后建模。

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

长话短说这是100%的预期,包括ServiceManager甚至可以绕过我们允许的某些电话。

我们甚至有能力在运行时将项目从服务器移动到服务器!

感谢大家帮助! (特别是我自己实际上做的工作,而不是勺子喂)

0

完成您要做的事情的最简单方法是停止使用服务器托管的服务URL来生成代理。相反,请从本地* .xsd和* .wsdl生成代理,并仅更改端点的URL。或者,您可以使用ChannelFactory<T>来即时生成代理,并在客户端引用您的接口.dll。

一旦你这样做了,你可以使用任何常见的网络服务器负载平衡技术来平衡服务器之间的负载。

不要把它放得太细,但Visual Studio的“服务引用”对您开发的服务没有用处,也不应该使用。它仅适用于外部开发的服务,其URL和合约很可能会从更改为。我个人从未有机会使用它。对于您自己的服务,您应该使用ChannelFactory<T>或基于ClientBase<T>的类来计算代理。

+0

如果需要,使用“添加服务引用”但在运行时更改URL会出现什么问题。 – 2010-08-24 22:38:49

+0

因为我们希望多个后端服务器对使用这些服务的Web应用程序是透明的。通过这种方式,所有Web应用程序都具有相同的代码库,无论其实际与哪个服务器进行通信。 – Jay 2010-08-25 12:41:40

1

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

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

+0

谢谢你的输入......我想这将是这样的事情。 我会审查邮件路由的东西,并选择我的poision。 再次感谢您的意见。 – Jay 2010-08-25 12:51:50