2011-09-16 4 views
2

En utilisant Remoting in C#, je me connecte à différents serveurs. Comme je ne cesse d'ajouter des fonctionnalités côté client, les services côté serveur ne sont pas toujours à jour.Remoting in C# VS versioning

Comment puis-je résoudre le problème que si j'appelle une méthode dans mon interface (qui invoque la méthode à distance sur le serveur) et cette méthode n'existe pas dans l'implémentation côté serveur?

Le client se bloque naturellement car il existe une exception que je ne peux pas détecter. Oui je pourrais, mais comme il y a beaucoup de différentes méthodes que j'appelle de cette manière, il serait douloureux d'ajouter une gestion d'Exception pour chacune d'entre elles.

Une "solution" dont j'ai parlé consistait à mettre un attribut de version personnalisé à chacune des méthodes de mon MarshalByRefObject. Mais je ne sais pas comment l'utiliser après avoir appelé chaque méthode. C'est correct pour moi d'ajouter une annotation/attribut à chaque méthode, mais il serait encore une douleur d'avoir une déclaration if demandant si la version est assez récente ou non.

Une autre façon que j'ai pensé était d'utiliser l'héritage pour cela.

public abstract class AbstractServer1 : MarshalByRefObject 
{ 
    public abstract void feature1(); 
} 

public abstract class AbstractServer2 : AbstractServer1 
{ 
    public abstract featureInVersion2(); 
    public abstract string reallyNewFeature(); 
} 

public class ServerClass1 : AbstractServer1 
{ 
    public void feature1(); 
} 

public class ServerClass2 : ServerClass1, AbstractServer2 
{ 
    public void featureInVersion2(); 
    public string reallyNewFeature(); 
} 

Mais cela aboutirait à quelque chose comme:

public AbstractServer getRemoteObject(string host, int port) 
{ 
    object obj = Activator.GetObject(typeof(AbstractServer2), "tcp://" + host + ":" + port.ToString() + "/ServiceName"); 
    if (typeof(obj) == ServerClass1) 
    { 
     ... 
    } 
} 

Et ce n'est ni beau ni ne fonctionne vraiment.

Y at-il une bonne solution à cela? Remarque: L'utilisation du même fichier d'assemblage dans le serveur et le client n'est malheureusement PAS une option.

Toute aide est appréciée.

+2

Saviez-vous que Remoting a été déprécié en faveur de WCF? Depuis .NET 3.0? –

+0

@John: Merci pour votre réponse rapide. Hmm non je ne l'ai pas fait: P D'accord ... J'ai juste jeté un oeil sur les tutoriels sur MSDN (http://msdn.microsoft.com/fr-fr/library/ms734712.aspx) et si je ne comprends pas complètement faux, mon problème sera le même même avec WCF. Est-ce que je manque quelque chose? – Atmocreations

+0

S'agit-il d'une exception côté client ou côté serveur? L'exception implique-t-elle une erreur de résolution d'assembly? – Seb

Répondre

1

Quel genre de comportement attendez-vous lorsque vous appelez une fonction qui n'existe pas sur le serveur?

This code might be usefull to you

Il construit une procuration qui attire toute exception qui a eu lieu lors de l'appel des membres d'un objet qui implémente une interface spécifique. Vous pouvez l'utiliser sur les canaux wpf ou sur les membres d'interface de vos proxies Remoting.

IMyInterface myService = [...]; 
IMyInterface myExceptionLoggedService = ExceptionProxyGenerator.Generate<IMyInterface>(myService); 
(myExceptionLoggedService as IExceptionProxy).Error+=(sender,method,exception)=>{ 
    // do what you want on exception 
}; 
// Use my service : 
myExceptionLoggedService.MyExistingFunction();// ok 
myExceptionLoggedService.MyNotExistingFunction();// calling the above delegate 

Vous pouvez réécrire un peu cette classe pour avoir le genre de comportement que vous voulez (pas comme rethrowing l'exception en cas d'erreur et retour fonction nulle -si ne retournera pas void-)