2009-05-22 34 views
14

Soy completamente nuevo en WCF. Estaba bastante seguro de que iba a funcionar como los servicios web habituales, y también estoy bastante seguro de que también estaba haciendo eso mal, pero ahora quiero asegurarme de que lo estoy haciendo bien.Uso de WCF en una aplicación ASP.Net y mejores prácticas

Nuestra aplicación ASP.Net se conecta al servicio WCF a través de Internet. Implementé la seguridad básica y el uso de SSL. Está funcionando, pero más lento que cuando teníamos servicios web regulares funcionando. La información que se devuelve es fundamentalmente la misma que con el servicio web regular.

Cuando estaba usando el servicio web normal, cada vez que necesitaba obtener datos, creaba un nuevo objeto de servicio y llamaba a la función para los datos que necesitaba. Esto parecía funcionar bien, pero como imaginaría, no era la mejor manera de hacerlo, especialmente si había miles de usuarios conectados al mismo tiempo. Entonces, cuando me convertí a WCF, decidí mantener abierto un cliente y simplemente usarlo para todos los que se conectaban al sitio. Lo puse en el caché y cuando el caché volcaría el objeto, tuve una función de devolución de llamada para eliminarlo.

Ahora ni siquiera lo pensé hasta después de haber cambiado todo esto, ya que podría plantear un problema para la conexión de varias personas. Si la persona A solicita datos, la persona B tiene que esperar a que finalice antes de que se obtengan sus datos a través del servicio.

Así que lo cambié para ser basado en la sesión. Implementé esto mal o simplemente salió mal, ya que no funcionó bien. El cliente se desconectaría, causaría una falla o simplemente no funcionaría. Lo cambié de nuevo a la memoria caché por ahora y parece estar funcionando bien (excepto lento).

¿Qué es una "mejor práctica" para este escenario? ¿Creé el cliente sobre la marcha cuando es necesario, creo una sesión basada (y entiendo lo que hice mal) o la conservo como está y uso el método de un cliente en caché?

+0

+1. Buena pregunta. – AnthonyWJones

Respuesta

6

Este tipo de problema generalmente se resuelve manteniendo un grupo. En lugar de tener solo un objeto de servicio en un extremo y uno por usuario en el otro extremo, el conjunto contendría una colección de objetos de servicio que son necesarios para soportar la demanda actual de sus servicios. Por lo tanto, el conjunto debería crecer solo hasta un punto de demanda máxima.

Se aseguraría de que los objetos salgan de la agrupación antes de cualquier otro tiempo de espera desde el interior del objeto de servicio y también se asegurará de que se eliminen si tienen algún tipo de excepción.

De esta forma, no tiene varias solicitudes de clientes esperando el acceso a un solo objeto ni tiene objetos inactivos en un servicio y probablemente muera antes de poder volver a usarlos de todos modos.

+1

Nunca se pensó en crear un grupo de clientes. Esto podría ser lo mejor de ambos mundos. No crea una tonelada de objetos sobre la marcha y tampoco desacelera cuando hay mucha actividad. ¡Gran idea! – TheCodeMonk

+0

Me gusta la técnica mencionada, ¿alguna forma en la que puedas señalar alguna implementación de esto para poder jugar? –

+0

Por miedo que suene, ya tengo una buena implementación para esto. Voy a probarlo y si funciona como espero, escribiré una publicación en el blog sobre esto y documentaré lo que hice. – TheCodeMonk

1

Normalmente, creo un cliente sobre la marcha como usted mencionó, pero asegúrese de desecharlo una vez que se complete la solicitud. He hecho esto sin un gran problema, pero para ser sincero, no tengo más de 1000 usuarios que aciertan exactamente al mismo servicio al mismo tiempo.

Puede encontrar los detalles de implementación exactos en la publicación de blog this si está interesado.

Solo para aclarar algo que usted mencionó en la pregunta: cuando dice "servicio web regular", ¿está hablando de ASMX o?

+0

Sí, ASMX. La disposición fue lo que más me preocupó. Creo que necesito hacer una refacturación para limpiar todo esto. – TheCodeMonk

4

La mejor práctica general para los servicios de WCF sería tener el modelo por instancia de instancia única siempre que sea posible. Esto le proporciona el mejor rendimiento, el mejor y más simple comportamiento en la instancia de servicio. Entonces, siempre que sea posible, y a menos que tenga una razón realmente convincente, use este modelo.

Parece que en su caso, la creación de la instancia de servicio es una operación bastante costosa. Tal vez deba limpiar esto de alguna manera: haga que la instancia real del servicio sea muy delgada y liviana para que pueda crearse y desecharse en un abrir y cerrar de ojos (o menos), y luego tener algunos procesos de trabajo en segundo plano (o posiblemente un grupo de ellos, como lo sugirió Anthony) a los que puede llamar desde sus instancias de servicio reales.

Marc

Cuestiones relacionadas