2009-06-24 14 views
6

Trabajo en una aplicación tipo chat, donde uso Silverlight en el lado del cliente y wpf en el lado del servidor. En este momento, la comunicación se basa en Sockets: tengo diferentes Message-Classes que serializo y envío a través de TCP.Zócalos vs. WCF

Empiezo dándome cuenta de que la creación de una clase de mensaje separada para cada escenario de comunicación posible es una sobrecarga y considero pasar a WCF.

por lo tanto necesito saber las siguientes cosas:

  1. Parece que toda la comunicación utilizando WCF se basa en los clientes callind métodos de mi servicio WCF expuestos. ¿Hay alguna manera de saber qué cliente llama un determinado método? Esto es bastante importante para mi aplicación.

  2. ¿WCF notifica a mi aplicación cuando un cliente se desconecta (por ejemplo, cierra la ventana del navegador donde se ejecuta el cliente de Silverlight) desde el servidor? Esto también es bastante importante.

  3. ¿Las llamadas al método son completamente asíncronas? Si es así, ¿debo redirigir cada llamada de método al hilo principal de la aplicación del servidor?

  4. ¿Cada conexión de cliente tiene su propio hilo? ¿Cuántas conexiones simultáneas podría manejar el servidor (que se ejecuta en una PC con una potencia razonable) si los clientes llaman a los métodos cada 2 segundos? Solo necesito una estimación (10, 100, 1000 o incluso más). "Más" sería genial;)

Quizás estoy completamente equivocado y WCF no funciona en absoluto basado en la conexión. Entonces tendría que encontrar una solución para seguir administrando una lista de conexiones activas.

Gracias por su ayuda! Andrej

+0

No tengo respuestas sólidas para usted, así que lo dejo en un comentario. Le sugiero encarecidamente que obtenga una copia de "Programming WCF Services 2nd Edition" de Juval Lowy. Sus libros deben responder todas sus preguntas. Respuesta corta: ciertamente puede manejar todos sus escenarios con WCF. El cómo se puede encontrar en el libro que mencioné. –

Respuesta

4
  1. Puesto que usted está utilizando una aplicación de Silverlight, se puede implementar un validador UserNamePassword en la capa de mensajes, lo que añade algunas cabeceras al mensaje de jabón, esto podría ser utilizado para identificar unívocamente los clientes, a menos que los clientes son anónimos . luego puede usar System.ServiceModel.OperationContext.Current, cuando necesite acceder al nombre de usuario en cualquier otro lugar del servicio wcf.

  2. No se notifica al servidor cuando el cliente se desconecta, ya que los mensajes son "PerCall" de manera predeterminada, hay una manera, use una clase Singleton como su ServiceConContextMode.Único, luego implemente un OperationContract con un servicio de devolución de llamada; luego, cuando los clientes inicien sesión en su servicio, deberán registrarse en el servicio de devolución de llamada; luego, el servicio de devolución de llamada podrá recorrer los clientes conectados y verificar el estado de la devolución de llamada, ya sea que esté abierta o no. finalmente elimine las entradas donde las conexiones están cerradas, eventualmente puede obtener la funcionalidad que necesita.

  3. Las llamadas asincrónicas, son del cliente, es decir. en Silverlight, todas las llamadas al servicio web son asincrónicas, como en ASP, tiene una opción, WCF maneja automáticamente la funcionalidad asíncrona, por lo que no necesita redireccionar nada, simplemente codifica el ServiceContract como si fuera un solo hilo, y todo estará bien

  4. Implemente la codificación de mensajes binarios en silverlight 3, para obtener el máximo rendimiento de su servidor y su ancho de banda, silverlight no admite conexiones tcp sin procesar, debe rapearse en un mensaje http por muy buenas razones. Cada cliente puede tener muchas llamadas concurrentes (async recordar), por lo que para mantener las cosas simples, solo piense en ello como si el servidor asignara un hilo separado a cada llamada de mensaje. Entonces para responder a su pregunta sobre lo que acaba de decir, 1000.

+0

Gracias por esta respuesta detallada :) Una última pregunta: ¿Mi método actual (usando Sockets) es muy superior al de WCF en términos de rendimiento? Si dice, WCF podría manejar 1000 conexiones simultáneas, ¿cuánto pueden manejar los sockets aproximadamente? 2000, 5000 o incluso 10.000? Espero que cada cliente envíe un mensaje cada 1 a 5 segundos. –

+0

Bueno, es así, cada cliente que se conecta obtiene una identificación de sesión y cada mensaje que se envía tiene una identificación única, por lo que teóricamente deberías poder enviar tantos mensajes simultáneos como el servidor pueda deserializar, trabajar y luego serializar la respuesta (ancho de banda limitado a). usar sockets tcp significa mucho menos cosas para serializar sobre codificación binaria sobre http, porque no hay http, cortando al intermediario siendo la capa de aplicación y haciendo tu propia capa leightweigth en tu código. así que eso significa menos trabajo de deserialización y trabajo de serialización, por lo que puede responder a más mensajes más rápidamente – Neil

+0

Bien, gracias de nuevo. –

0

Por 3 lo sé Puede llamar a async.

Y para 4 sí, tienen sus propios hilos. WCF es bastante "GRANDE" y complejo, deberías obtener un libro para entenderlo mejor.

0

Mis respuestas:

  1. Sí. Toda la comunicación se basa en los métodos de llamada.
  2. En general - No.
  3. Puede llamar a los métodos de forma síncrona o asíncrona. Esta es tu elección.
  4. Más. Yo caso de diseño de sistema correcto.