WCF сериализация методов тела - PullRequest
1 голос
/ 24 февраля 2010

Я пишу какую-то вычислительную ферму с центральным сервером, предоставляющую задачи и узлы, которые их вычисляют.

Я хотел написать так, чтобы узлы не знали, что именно они вычисляют. Они получают (с сервера) объект, который реализует интерфейс IComputable, имеет один метод, .compute (), который возвращает объект типа IResult и отправляет его на сервер.

Сервер отвечает за подготовку этих объектов и их обслуживание с помощью метода .getWork () службы wcf и получает результаты с помощью метода .submitResult (IResult result).

Проблема в том, что рабочим узлам необходимо знать не только интерфейс, но и полную реализацию объекта. Я знаю, что Java может сериализовать метод (возможно, байт-код) через RMI. Возможно ли это с помощью c #?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

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

Хотя нужно позаботиться. Если вы принимаете код из произвольных источников, вам придется заблокировать то, что могут делать эти загруженные сборки (и это хорошая практика, даже если вы доверяете источнику).

Хорошим классическим примером того, как это сделать, является проект Terrarium . Это тематическое исследование, которое разработала Microsoft, которое включало в себя распространение вирусов произвольных сборок безопасным способом.

0 голосов
/ 24 февраля 2010

Вы можете сделать

System.Expression.LambdaExpression<Func<result>> lambda = MyFunction;

и затем вы можете сериализовать выражение в строку и десериализовать на сервере

...