2009-01-11 6 views
0

Il peut y avoir plusieurs instances de mon service sur le même ordinateur, chacune d'elles sur un port différent.Port de l'appel en cours dans Remoting

Comment puis-je récupérer le numéro de port à partir duquel la demande actuelle est passée pour les différencier?

Pour clarifier les choses, si le client appelle la méthode suivante:

class OrdersService : MarshalByRefObject 
{ 
    public void EnqueueOrder(Order order) 
    { 
     //int port = ?? 
    } 
} 

J'ai besoin du numéro de port à partir duquel a été fait la demande. PS: J'ai essayé d'implémenter l'interface IServerChannelSink mais elle ne peut accéder qu'à l'URI (comme/foo/bar) et à l'adresse IP du client.

Merci

Répondre

0

Si vous avez besoin de rappeler au client, cela devrait être une partie de votre contrat:

public void EnqueueOrder(Order order, IClient client) 
{ 
    // Work with the order. 

    // Call back to the client. 
} 

Du côté client, vous implémenter l'interface iClient avec une classe qui dérive de MarshalByRefObject et passe cela à la méthode EnqueueOrder.

0

C'est odieux, et pas très généralisée, mais devrait fonctionner pour vous:

TcpChannel  channel = (TcpChannel)ChannelServices.RegisteredChannels[0]; 
ChannelDataStore data = (ChannelDataStore)channel.ChannelData; 
string   uri  = data.ChannelUris[0]; 
int    port = int.Parse(uri.Substring(uri.LastIndexOf(':'))); 

Notez que vous aurez besoin d'une référence à System.runtime.remoting.dll et vous aurez besoin using s pour System.Runtime.Remoting.Channels et System.Runtime.Remoting.Channels.Tcp. Bien sûr, si vous avez plus d'un canal enregistré, et/ou ce n'est pas TCP, et/ou si vous avez plus d'un URI pour le canal, alors vous devrez écrire du code meilleur que le hack-job Je l'ai fait ci-dessus, mais ça devrait vous donner l'idée, de toute façon.


Comment ces instances de serveur distinctes sont-elles démarrées, de toute façon? Comment le port est-il sélectionné en premier lieu? Comment le client découvre-t-il le port? Les réponses à ces questions peuvent révéler une méthode plus idéale pour distinguer l'instance dans le code du serveur, comme un identifiant d'instance transmis sur la ligne de commande.