0

我开始创建一个小型云平台,供以后学习和扩展到实际使用。我正在将 C# 与 WCF 一起使用。我的想法是拥有一个服务器和执行器系统。服务器将拥有用户提交给它的作业。执行器系统向服务器询问作业并执行作业并将结果更新到服务器。该作业是一个 C# 类对象,它具有execute()将由执行程序调用的方法。

我的问题是如何将对象及其方法(行为)移交给 Executor 以便 Executor 执行它。通过序列化对象,只会发送数据。我想知道像Utilify这样的云框架是如何实现的。尽管我更喜欢 WCF,但我对任何 C# 技术都可以在远程系统上执行这项工作持开放态度。

4

2 回答 2

0

我不推荐二进制序列化方法。我已经尝试过将二进制可执行代码发送到工作服务器的系统。这要么是不可能的,要么在很大程度上是不切实际的——(想象一下,如果你有很多代码要执行。每次你想执行它时通过网络发送所有代码是否可行?为什么不将代码存储在本地和只需通过网络发送变量)。

从内存中:我认为问题在于将程序集字节反序列化/解码为您可以调用的类.execute()。从理论上讲,您可以将其转换为调用MyAction并调用.execute()它的父类,但实际上这不起作用。

我同意 Bartlett 建议的替代方法。“工作服务器”应该存储一个版本ActionsICanProcess.dll,当被查询时,它可以告诉“作业分发服务器”它可以处理哪些命令。要使用新的作业定义更新“工作服务器”,您只需将新的“ActionsICanProcess.dll”传输到每个“工作服务器”。

于 2012-07-27T14:04:19.087 回答
0

如果您真的想这样做,您将不得不以某种方式将定义您的作业的程序集的二进制表示传输到执行程序,然后将其加载到 AppDomain 以运行您的代码。

var tempDomain = AppDomain.CreateDomain(someDomain);
tempDomain.Load(myTransmittedAssemblyBytes);

请注意,您将创建一个充满安全漏洞的世界!确保您信任您正在加载的任何代码。

或者,为什么不让您的执行者宣传他们可以处理的工作类型,并且只向他们发送他们知道如何处理的数据。

于 2012-07-27T12:16:02.443 回答