在客户端实现命令,在服务器执行命令

本文关键字:命令 执行 服务器 客户端 实现 | 更新日期: 2023-09-27 17:55:22

我正在实现一个 WCF 服务,我希望以这样一种方式实现它,即客户端应该能够在服务器上执行命令,即使服务器上不存在命令的实现。

代码应如下所示:

//Common interface - used by both client and server
public interface ICommand
{
      //add whatever method/property is needed to achieve the goal
}
//Server side interface and implementation
[ServiceContract()]
public interface ICommandChannel
{
    [OperationContract]
    object ExecuteCommand(ICommand command, Guid clientId);
}
public class CommandExecutor : ICommandChannel
{
    object ExecuteCommand(ICommand command, Guid clientId)
    {
         //this should be able to execute any command clients send
    }
}

//Client side commands implementation
public class FileUploadCommand : ICommand
{
}
public class AuthorizeUSerCommand : ICommand
{
}
public class SubmitChangesCommand : ICommand
{
}
//etc

如果允许序列化方法,那么解决方案将非常简单,因为我们可以序列化Execute ICommand中定义的方法(和其他方法),通过通道发送它,并在服务器上反序列化它,并调用Execute方法。但这是不可能的,因为不允许序列化方法(据我所知)。

所以我的问题是,这个问题有什么解决方案吗?表达式树可以在这里提供帮助吗?


编辑:

我不能让服务器知道实现。因为如果我这样做,那么每次在客户端添加新命令时,我都必须构建和部署服务。还是我错过了什么?

在客户端实现命令,在服务器执行命令

表达式树不容易序列化,即使序列化,表达式编译器也不支持允许更多类似方法使用的 4.0 扩展,因此创建表达式将非常棘手。

此外,允许任意代码执行不能掉以轻心 - 存在许多安全隐患。

就个人而言,我怀疑您最好的选择是通过程序集共享(提前)让服务器知道实现(因此客户端和服务器上的协定类是相同的,从库 dll 加载)。但是,通过脚本语言可能存在另一种选择 - 也许你可以用 iron-python 编写该方法?您也可以使用 C# 并即时编译 - 但我重复我的警告:在服务器上运行输入即代码?不是很安全。