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

时间:2011-05-09 06:38:58

标签: c# wcf web-services serialization service

我正在实现一个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方法。但这是不可能的,因为不允许序列化方法(据我所知)。

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


编辑:

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

1 个答案:

答案 0 :(得分:1)

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

此外,允许任意代码执行不是一件容易的事情 - 有很多安全隐患。

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