【问题标题】:Implementing command at client, executing it at sever在客户端执行命令,在服务器执行
【发布时间】:2011-05-09 06:38:57
【问题描述】:

我正在实现 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

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

所以我的问题是,有没有办法解决这个问题?表达式树在这里有帮助吗?


编辑:

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

【问题讨论】:

    标签: c# wcf web-services serialization service


    【解决方案1】:

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

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

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

    【讨论】:

    • 马克,这就是问题所在。我不能让服务器知道实现。因为如果我这样做,那么每次在客户端添加新命令时,我都必须构建和部署服务。还是我错过了什么?
    • 另外,我对iron-python一无所知,但如果它提供优雅的解决方案,我可以学习它(你能解释一下它是如何解决问题的(这样我就可以从那里开始)?)。它是否针对 CLR?
    • @Nawaz - 是的; python 是一种脚本语言,因此可以作为字符串部署; iron-python 是 python 的托管 (.NET) 实现,可以在 .NET 中作为脚本语言调用。如果这更容易的话,还有 .NET 的 javascript 实现。
    • @Marc:我知道 python(基础知识),不知道 Iron-python 是它的 .NET 实现。但是我想知道如果我在 Iron-python 中执行此操作,那么每个与我一起工作以及将来工作的 .NET 开发人员都必须学习 Iron-python,以便能够向客户端添加新命令。如果是这样,那么看来我应该在 Iron-python 中执行此操作。 :|
    • @Nawaz - 但要强调的是,我个人:“每次我在客户端添加新命令时,我都必须构建和部署服务”是的;这是正确的,是我解决这个问题的首选方法
    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2018-09-11
    • 2021-12-20
    相关资源
    最近更新 更多