2009-10-15 8 views
2

Est-il possible de transmettre un rappel via un accès distant? Je voudrais faire quelque chose dans le sens de myRemoteObject.PerformStuff(x => Console.WriteLine(x));.NET Remoting callback

Sinon, comment pourrais-je implémenter une fonctionnalité équivalente?

Edit: Je suis au courant Remoting se est supplanté par WCF, mais je suis toujours intéressé dans ce cas précis. (Par curiosité cependant, quel est le problème dans WCF?)

Répondre

1

Remoting prend en charge les événements. Le code client peut simplement s'abonner à un événement exposé par la classe de serveur. (Il y a une grande liste de mises en garde ici).

De même, vous pouvez passer une interface de rappel à une classe distante, à condition que votre implémentation de l'interface soit un objet MarshalByRef.

interface IMyCallback 
{ 
     void OnSomethingHappened(string information); 
} 


class MyCallbackImplementation : MarshalByRefObject, IMyCallback 
{ 
    public void OnSomethingHappened(string information) 
    { 
     // ... 
    } 

} 



class MyServerImplementation : MarshalByRefObject 
{ 
    List<IMyCallback> _callbacks = new List<IMyCallback>(); 

    public void RegisterCallback(IMyCallback _callback) 
    { 
      _callbacks.Add(_callback); 
    } 

    public void InvokeCalbacks(string information) 
    { 
     foreach(IMyCallback callback in _callbacks) 
     { 
       _callback.OnSomethingHappened(information); 
     } 
    } 

} 
0

Dans WCF vous utilisez callback operations. Si vous pouvez utiliser WCF ou à distance, choisissez WCF. Remoting est classé comme héritage.

+0

Ne répond pas à la question réelle cependant. :( – mafu

4

Important d'ajouter que vous devez enregistrer des canaux duplex, pas seulement un serveur ou un client. Sinon, le rappel ne fonctionnera pas.

E.g. TcpChannel/HttpChannel/IpcChannel et pas TcpServerChannel/TcpClientChannel et ainsi de suite.

Pour les solutions pare-feu, assurez-vous que le port de rappel est ouvert sur le 'client' pour les canaux TCP et HTTP (IPC n'utilise pas les ports).