Реализация команды на клиенте, выполнение ее на сервере - PullRequest
1 голос
/ 09 мая 2011

Я внедряю службу 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. Но это невозможно, потому что сериализация метода не разрешена (насколько я знаю).

Итак, мой вопрос, есть ли решение этой проблемы? Может ли здесь помочь дерево выражений?


EDIT:

Я не могу сообщить серверу о реализации. Потому что, если я это сделаю, то мне придется создавать и развертывать сервис каждый раз, когда я добавляю новые команды на стороне клиента. Или я что-то упустил?

1 Ответ

1 голос
/ 09 мая 2011

Деревья выражений нелегко сериализовать, и даже если бы они были, расширения 4.0, позволяющие использовать их как методы, не поддерживаются компилятором выражений, поэтому создание выражений было бы очень сложно.

Кроме того, разрешить выполнение произвольного кода не следует воспринимать легкомысленно - есть много последствий для безопасности.

Лично я подозреваю, что вам лучше всего будет сообщить серверу реализацию (заранее), возможно, через совместное использование сборок (поэтому классы контрактов на клиенте и сервере идентичны, загружены из библиотеки). DLL). Тем не менее, другой вариант может существовать через скриптовые языки - может быть, вы могли бы написать метод в Iron-Python? Вы могли бы также использовать C # и компилировать на лету - но я повторяю свое предупреждение: запускать ввод как код на сервере? не очень безопасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...