2010-02-24 4 views
1

J'écris une sorte de batterie de calcul avec un serveur central qui fournit des tâches et des nœuds qui les calculent. Je voulais l'écrire de telle sorte que les nœuds ne sachent pas exactement ce qu'ils calculent. Ils obtiennent (à partir du serveur) un objet qui implémente ICerfutable iterface, a une méthode, .compute() qui renvoie l'objet de type IResult et l'envoie au serveur.Sérialisation WCF des corps de méthode

Le serveur est chargé de préparer ces objets et de les servir via la méthode .getWork() sur le service wcf, et obtient les résultats avec la méthode .submitResult (IResult result).

Le problème est que les nœuds de travail doivent connaître non seulement l'interface, mais également l'implémentation de l'objet complet. Je sais que Java peut sérialiser la méthode (probablement au bytecode) via RMI. Est-ce possible avec C#?

Répondre

2

Ce que vous devrez faire est de mettre le type qui implémente la méthode que vous décrivez dans un ensemble séparé. Vous pouvez ensuite envoyer l'assembly en tant que tableau d'octets à votre serveur, où il chargera l'assembly, l'isolera pour les types qui correspondent à votre interface, puis les chargera. C'est le modèle de base pour les plug-ins utilisant .Net.

Cependant, il faut faire attention. Si vous acceptez du code provenant de sources arbitraires, vous devrez verrouiller ce que ces assemblys chargés peuvent faire (et c'est une bonne pratique à faire même si vous faites confiance à la source).

Un bon exemple classique pour ce faire est le projet Terrarium. C'est une étude de cas produite par Microsoft qui impliquait la propagation virale d'assemblages arbitraires de manière sécurisée.

+0

Passage DLLs avec le code arbitraire est probablement une solution viable, mais d'assurer la sécurité de qui peut être fou: D – user76035

-1

Vous pouvez faire

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

et vous pouvez sérialiser expression à chaîne et désérialiser sur le serveur

+0

Ceci fonctionnera uniquement pour un sous-ensemble limité de valeurs pour "MyFunction". Par exemple, il ne peut utiliser aucune variable capturée. Ceux-ci ne seront pas traduisibles en texte et en retour, car ils existent en mémoire sur la machine source. –

+0

À propos du sous-ensemble limité - true. Les variables capturées peuvent être évaluées à leurs valeurs et affichées en tant que constantes, donc var i = 1; ExecuteOnServer (Compute (i)) devient sous forme sérialisée "(Call Compute 1)". J'ai aussi supposé une sorte de modèle de commande plutôt que de décompiler toutes les fonctions et d'afficher IL. – user76035

Questions connexes