我正在实现一个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
方法。但这是不可能的,因为不允许序列化方法(据我所知)。
所以我的问题是,这个问题有什么解决方案吗?表达式树可以帮助吗?
编辑:
我不能让服务器知道实现。因为如果我这样做,那么每次在客户端添加新命令时,我都要构建和部署服务。或者我错过了什么?
答案 0 :(得分:1)
表达式树不容易序列化,即使它们是,但表达式编译器不支持4.0扩展以允许更多类似方法的用法,因此创建表达式将非常棘手。
此外,允许任意代码执行不是一件容易的事情 - 有很多安全隐患。
就个人而言,我怀疑你最好的选择是让服务器知道实现(提前)或许通过程序集共享(因此客户端和服务器上的合同类是相同的,从一个加载图书馆dll)。但是,通过脚本语言可能存在另一种选择 - 也许你可以用iron-python编写方法?您可以也使用C#并在运行中编译 - 但我重复我的警告:在服务器上运行输入作为代码?不太安全。