Question

Supposons que vous avez enregistré deux TcpChannels dans .NET Remoting.

Alors je tente d'obtenir le proxy à l'aide Activator.GetObject en utilisant une URL tcp://...

Est-il possible de choisir le canal à utiliser?

Merci à l'avance.

Était-ce utile?

La solution

Avez-vous résoudre ce problème?

J'ai eu exactement le même problème la semaine dernière. (Un léger non publiées effet secondaire de nunit est qu'il déclenche le canal par défaut « tcp » lors du chargement de vos dll pour exécuter des tests unitaires (mon problème) ... alors je créais une coutume par exemple TcpClientChannel avec des éviers personnalisés pour parler à nos logiciel serveur ... et nos puits ne tiraient pas quand j'instancié un objet serveur)

Il y a 3 solutions:

  1. Si vous voulez un à l'autre neutraliser en permanence alors simplement passer la propriété « priorité » dans le constructeur IDictionary sur votre TcpClientChannel. La valeur par défaut sinon défini est 1, donc si vous voulez passer outre dire l'enregistrement de canal par défaut « tcp » puis réglez supérieur à 1. NB la propriété « nom » doit également être défini, mais peut être string.Empty si nécessaire (et alors vous pouvez avoir autant de ceux-ci que vous voulez)

  2. Nommez vos canaux lors de l'enregistrement, puis d'écrire une belle enveloppe IDisposable à l'appel dans un « utilisant » construction, qui appelle ChannelServices.Unregister (...) sur les canaux que vous ne souhaitez pas activer lors de l'appel Activator .GetObject (...). Puis, lorsque votre « en utilisant » extrémités de bloc (par exemple appelle Dispose ()), juste recharger les canaux que vous non enregistré ... assurez-vous d'utiliser « verrouillage » sur une référence d'objet commun si son multithread au sein de votre application ... cela peut créer un goulot! (Ceci est l'approche que je pris, comme mes tests unitaires utilisaient une bibliothèque écrite préalable qui a créé la connexion du serveur: le risque d'instabilité dans le logiciel de production pour le bien de mes tests unitaires était trop élevé)

  3. bump temporairement la priorité de votre canal cible en utilisant une réflexion profonde (c.-à jongler avec FieldInfos privé ... à savoir le _channelPriority int privé (je pense) ... réflecteur utilisation à double contrôle), avant d'appeler Activator. GetObject. Ceci est également ouvert aux questions de filetage, et pas non plus la version à l'épreuve-cadre (donc j'évitais celui-ci)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top