Hay dos problemas que me encontré anoche que he resuelto ahora, pero no estoy 100% seguro de por qué lo que he hecho los resolvió y esperaba que alguien pudiera ofrecer alguno visión ya que he estado dando vueltas a muchas rocas y ¡no he tenido suerte!Dos únicos conductos con nombre en conflicto y InvalidCredentialException
primer problema
La primera cuestión es que tenía dos tubos con un nombre único que se encontraban en dos programas separados:
- net.pipe: // localhost/superuniquepipe1
- red. pipe: // localhost/superuniquepipe2
Sin embargo, el segundo programa para lanzar arrojaría una excepción (I beli hasta que fue AddressAlreadyInUseException) al abrir el ServiceHost debido a que la dirección ya está en uso.
La forma en que fue crear instancias de estos ServiceHosts fue el siguiente:
Uri[] baseAddresses = new Uri[] { new Uri("net.pipe://localhost") };
this.host = new ServiceHost(this, baseAddresses);
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "superuniquepipe1");
this.host.Open();
Así que yo se especifica la dirección base del localhost en primer lugar, a continuación, especifique el resto de ella cuando se añade el punto final, el camino decidí que esto era para cambiar el código de la siguiente manera:
this.host = new ServiceHost(this);
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "net.pipe://localhost/superuniquepipe2");
this.host.Open();
Estoy en lo correcto al decir la razón de esto funcionó es porque estaba comprobando sólo las direcciones de base y no el punto final yo estaba tratando de agregar? ¿Y está utilizando la segunda muestra de código como una forma válida/segura de tener múltiples programas escuchando en "localhost"?
segundo problema:
En un intento de solucionar lo anterior, había cambiado la dirección de base de localhost a un número de diferentes cadenas únicas, por ejemplo, "Net.pipe: // rawrwhyisntthisworkingsadface", pero cuando se hace esto estaría presenté con un InvalidCredentialException desde el cliente intenta establecer una conexión (véase más abajo el código)
estaba bajo la impresión de una tubería con nombre puede ser, literalmente, nombrado algo, ¿alguien puede arrojar algo de luz sobre este?
ChannelFactory<IHostType> factory = new ChannelFactory<IHostType>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://rawrwhyisntthisworkingsadface/superuniquepipe2"));
IHostType proxy = factory.CreateChannel();
proxy.CallSomeMethodAndGetAnException();
Cualquier entrada sería muy apreciada, como ya he dicho que he resuelto el problema y sólo quieren saber por qué mi solución funcionó, pero si usted ve un defecto en la forma en que he resuelto y puede sugerir una mejor forma de hacerlo por favor hágalo :)
Para ampliar esto, estoy recibiendo el mismo problema me creer, y esto es la excepción: ** [TIPO]: ** ** System.ServiceModel.AddressAlreadyInUseException [mensaje]: ** No se puede escucha en el nombre de la tubería 'net.pipe: // localhost /' porque otro extremo de la tubería ya está escuchando ese nombre. – ebol2000