2011-04-28 15 views
6

Supongamos que ha registrado dos TcpChannels en .NET Remoting.Seleccione un canal específico en Activator.GetObject

entonces trato de conseguir el proxy utilizando Activator.GetObject utilizando una URL tcp://...

¿Es posible elegir el canal que usará?

Gracias de antemano.

+0

Solo una nota: Remoting ha quedado en desuso en favor de WCF. – Amy

+0

@Inuyasha: Sí, pero algunos todavía usan desventajas. RED :-( –

Respuesta

5

¿Has resuelto esto?

He tenido exactamente el mismo problema la semana pasada. (Un ligero efecto secundario no publicitado de nunit es que activa el canal predeterminado "tcp" cuando carga sus dlls para ejecutar pruebas unitarias (mi problema) ... entonces estaba creando una instancia personalizada de TcpClientChannel con receptores personalizados para hablar con nuestro software de servidor ... y nuestros lavabos no disparaban cuando crea una instancia de un objeto de servidor)

Hay 3 soluciones:

  1. Si quieres uno para anular de forma permanente la otra a continuación, simplemente pasan a la "prioridad "propiedad en el constructor IDictionary en su TcpClientChannel. El valor predeterminado, si no está configurado, es 1, por lo que si desea sobrescribir, indique el registro del canal "tcp" predeterminado y luego establezca un valor superior a 1. NB la propiedad "nombre" también debe establecerse, pero puede ser string.Empty si es necesario (y entonces puede tener tantos de estos como desee)

  2. Nombre sus canales cuando se registre, luego escriba un buen envoltorio IDisposable para llamar a un constructo "using", que llama a ChannelServices.Unregister (...) en el canales que no desea activar cuando se llama a Activator.GetObject (...). Luego, cuando finaliza tu bloque "usar" (es decir, llamadas Dispose()), simplemente vuelve a cargar los canales que no registraste ... asegúrate de usar "bloqueo" en alguna referencia de objeto común si tiene múltiples hilos dentro de tu aplicación ... esto puede crear un ¡embotellamiento! (Este es el enfoque que tomé, ya que mis pruebas unitarias usaban una biblioteca preescrita que creaba la conexión del servidor: el riesgo de inestabilidad en el software de producción por el solo resultado de mi unidad era demasiado alto)

  3. Temporalmente Mejora la prioridad de tu canal objetivo mediante la reflexión profunda (es decir, jugando con FieldInfos privados ... es decir, el privado int _channelPriority (creo) ... usa el reflector para verificar dos veces), antes de llamar a Activator.GetObject. Esto también está abierto a problemas de enhebrado, y tampoco a prueba de versión de framework (así que evité este)

Cuestiones relacionadas