Compartir a través de


Chat seguro de canal del mismo nivel

Download sample

Este ejemplo muestra cómo utilizar el enlace NetPeerTcpBinding con autenticación basada en contraseña, que proporciona comunicación de múltiples usuarios mediante PeerChanel. Este ejemplo es una variación de Ejemplo de introducción. Vea Ejemplo de introducción para obtener una descripción general de Windows Communication Foundation (WCF).

En este ejemplo, la instancias de aplicación son aplicaciones de consola hospedadas por sí mismas.

A diferencia de otros ejemplos de enlace de transporte, este ejemplo utiliza la interfaz de contrato IChat con el propósito de mostrar la comunicación entre varias personas. Todas las instancias implementan este contrato para recibir los mensajes y crear servidores proxy con el mismo contrato para enviar mensajes a la malla. Esto se muestra creando un DuplexChannel en la malla.

Nota

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

Entender el proceso de configuración de enlace en el ejemplo implica los siguientes conceptos de PeerChannel:

  • Una resolución del mismo nivel es responsable de resolver un id. de la malla en las direcciones del extremo de unos nodos en la malla.

  • Una malla es una colección con nombre de nodos del mismo nivel identificada por el id. de la malla.

  • Un nodo del mismo nivel es una instancia de una aplicación que participa en la malla.

  • Los id. de la malla identifican la parte del host de la dirección de un extremo en la malla. Los ejemplos de estas direcciones son "net.p2p://chatMesh/servicemodelsamples/chat" o "net.p2p://broadcastMesh/servicemodelsamples/announcements". chatMesh y broadcastMesh son los id. de la malla.

  • Todos los clientes que participan en una malla utilizan el mismo id. de malla, aunque podrían utilizar rutas de acceso y servicios diferentes. Un mensaje enviado a una dirección de extremo concreta se entrega a todos los canales del mismo nivel que utilicen esa dirección.

Cuando se abre un nodo del mismo nivel (como resultado de abrir el canal del mismo nivel), utiliza una resolución del mismo nivel para resolver el id. de malla en las direcciones de algunos nodos del mismo nivel con el que conectarse. Esto crea una malla de nodos interconectados y permite que se propaguen mensajes por la malla.

PeerTransportCredentialType especifica cómo los puntos de la malla se autentican entre sí. Esta propiedad se puede especificar en la configuración de enlace, en el objeto NetPeerTcpBinding o usando PeerTransportBindingElement. Se debe agregar una instancia de ClientCredentialSettings (o ServiceCredentialSettings) con credenciales adecuadas especificadas en la propiedad Peer a la colección de comportamientos en el generador de canales o ServiceHost en función del uso.

  1. Este ejemplo utiliza el modo de autenticación mediante contraseña para hacer que PeerChannel sea seguro (que es el modo predeterminado). Esto se logra estableciendo una conexión segura entre los vecinos e intercambiando una transformación de esta contraseña. Cuando se especifica Password, la propiedad ClientCredentialSettings.Peer debe llevar una contraseña válida y opcionalmente una instancia de X509Certificate2 (con SetSelfCertificate).

El enlace se especifica en el archivo de configuración de la aplicación. El tipo de enlace se especifica en el atributo de enlace del elemento del extremo tal y como se muestra en el ejemplo siguiente.

<client>
   <!-- chat instance participating in the mesh -->
   <endpoint name="SecureChatEndpoint"
            address="net.p2p://SecureChatMesh/servicemodelsamples/chat"
             binding="netPeerTcpBinding"
             bindingConfiguration="SecureChatBinding"
             contract="Microsoft.ServiceModel.Samples.IChat">
   </endpoint>
 </client>

Si utiliza el enlace NetPeerTcpBinding con el comportamiento predeterminado, se habilita la seguridad basada en la contraseña. El elemento del enlace proporciona los atributos para establecer el puerto, la dirección IP de escucha, el tipo de resolución, el tamaño máximo del mensaje, el tamaño del grupo de búferes máximo, las cuotas del lector, el modo de autenticación de los nodos del mismo nivel, la autenticación de mensajes y los tiempos de espera (para cerrar, abrir, enviar y recibir).

Nota: Este ejemplo utiliza la resolución predeterminada del mismo nivel (PNRP), que no está disponible en Windows Server 2003. Por consiguiente, para ejecutar este ejemplo en Windows Server 2003, debe utilizar una resolución personalizada del mismo nivel. Vea Chat del canal del mismo nivel para obtener un ejemplo que utiliza una resolución de mismo nivel personalizada, por ejemplo:

<netPeerTcpBinding>
   <binding configurationName="Binding1"> 
    <resolver mode="Custom">
       <customResolver 
            type="MyAppNameSpace.MyCustomPeerResolver, myApp"/>
    </resolver>
   </binding>
</netPeerTcpBinding>

El archivo que contiene MyCustomPeerResolver debe estar compilado con la aplicación. Tenga en cuenta que si el ejemplo se ejecuta en varios equipos con plataformas diferentes, todas deberían usar la misma resolución.

Esta implementación de chat también muestra cómo recuperar el nodo de mismo nivel asociado con el receptor o instancia del remitente y registrar sus eventos en línea y sin conexión. Se desencadena un evento en línea cuando el nodo entre pares está conectado al menos a otro nodo del mismo nivel en la malla. Se desencadena un evento sin conexión cuando un nodo del mismo nivel ya no está conectado a cualquier otro nodo del mismo nivel en la malla.

En este momento, el canal del mismo nivel no se integra con la Service Model Metadata Utility Tool (Svcutil.exe). Por esta razón, Svcutil.exe no se puede utilizar para generar un canal con tipos para el remitente.

Al ejecutar el ejemplo, el cliente solicitará un sobrenombre y una contraseña, después de lo cual mostrará un mensaje indicando que está preparado para enviar mensajes. Los mensajes del chat se mostrarán en las otras ventanas de la consola del cliente. Para finalizar el cliente, presione la tecla Q seguida de ENTRAR en las ventanas de la consola de un cliente.

Si habilita el seguimiento o el registro de mensajes, puede supervisar la actividad del remitente y del receptor en un nivel más profundo. La sección de procedimientos describe cómo habilitar el seguimiento y el registro de los mensajes.

Nota

Es importante tener en cuenta que el ejemplo no administra actualmente todas las posibles excepciones que la infraestructura puede producir. Si está utilizando estos ejemplos en un entorno comercial/producción, siga los consejos recomendados para la gestión correcta de las excepciones.

Para configurar, generar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado Procedimiento de instalación único para ejemplos de Windows Communication Foundation.

  2. Para generar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Generación de ejemplos de Windows Communication Foundation.

  3. Para ejecutar el ejemplo en una configuración de equipos única, siga las instrucciones de Ejecución de ejemplos de Windows Communication Foundation.

  4. Para instalar PNRP en Windows XP SP2 (instalación única):

    1. En el Panel de control, haga doble clic en Agregar o quitar programas.

    2. En el cuadro de diálogo Agregar o quitar programas, haga clic en Agregar o quitar componentes de Windows.

    3. En el Asistente para componentes de Windows, seleccione la casilla de verificación "Servicios de red" y haga clic en "Detalles".

    4. Marque la casilla "Entre iguales" y haga clic en "Aceptar".

    5. Haga clic en "Siguiente" en el Asistente para componentes de Windows.

    6. Cuando la instalación termine, haga clic en "Finalizar".

    7. En un símbolo de shell de sistema, inicie el servicio PNRP con el comando siguiente: net start pnrpsvc.

  5. Inicie múltiples instancia del ejemplo, cada vez introduciendo un sobrenombre y una contraseña. El sobrenombre de cada cliente debería ser diferente, y la contraseña debería ser la misma para todas las instancias. Los mensajes del chat enviados por una instancia de la aplicación son recibidos por todas las demás instancias, siempre que los sobrenombres sean diferentes y la contraseña coincida. Se permiten múltiples clientes con el mismo sobrenombre, pero no se muestran los mensajes de clientes con el mismo sobrenombre.

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.