2012-10-04 31 views
6

Estoy atascado en lo que estoy seguro es un problema fundamental y fácil de resolver en WCF, solo tiene que guiarse hacia el camino correcto.Persistir objeto en C# .NET Web Service

Tengo un objeto grande (que en realidad es un clasificador de texto entrenado) que necesito exponer a través de un servicio web en C# .NET. El objeto clasificador se puede cargar desde el disco cuando el servicio se inicia inicialmente, pero no quiero seguir cargando desde el disco para cada solicitud (el objeto que las solicitudes de servicios actualmente ocupan unos 6 GB en memoria, y lleva un tiempo mantenerlo). cargarlo desde el disco para cada petición), así que en vez quiero persistir ese objeto en la memoria a través de todas las solicitudes a que el servicio web, y el objeto sólo se debe cargar cuando se inicia el servicio (en lugar de cargarlo cuando la primera la solicitud web lo activa).

¿Cómo podría hacer eso?

Gracias por cualquier ayuda!

+0

¿Tiene previsto albergar en IIS, o en su propia [ServiceHost] (http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost.aspx)? – OffHeGoes

+0

IIS idealmente, pero es fácil si tiene otra opción. – ToOsIK

+1

Bueno, personalmente, usaría IIS si fuera a exponer esto al mundo exterior, pero es más fácil mantener el estado dentro de un servicio de Windows que expone un servicio web utilizando un ServiceHost. – OffHeGoes

Respuesta

5

Probablemente la manera más fácil es crear su servicio como singleton. Esto implica especificar InstanceContextMode = InstanceContextMode.Single en un atributo ServiceBehavior en la definición de clase de servicio.

Sin embargo es muy cuestionable si el envío de un objeto sobre el alambre de 6 GB utilizando WCF es aconsejable. Puede encontrarse con todo tipo de problemas de disponibilidad del servicio con este enfoque.

Además, no son únicos dentro de un huésped escalable (puede ser sólo una instancia por sistema), aunque se puede alojar múltiples servicios únicos y luego equilibrar la carga de las solicitudes.

+0

Gracias por la respuesta, no estoy realmente enviando el objeto de 6GB ... todo lo que tengo que hacer es asegurarme de que este objeto esté cargado antes de que las solicitudes lleguen al servicio web (así cargadas en la etapa de inicialización), y que todas las solicitudes recibirá servicio utilizando este único objeto (que tiene un tamaño de aproximadamente 6 GB), en lugar de que cada solicitud cree su propio objeto por separado. ¡Creo que tienes razón y los servicios de Singleton son el camino a seguir! – ToOsIK

+0

@ToOsIK Probablemente sea una buena idea actualizar su pregunta. Parecía que estabas tratando de enviar un objeto de 6GB a través de WCF. –

+1

Probablemente necesite autohospedarse con ServiceHost para su escenario. Ver el enlace @hugh singleton "Quizás inicializar el recurso escaso que maneja singleton lleva demasiado tiempo y no querrás penalizar al primer cliente." – OffHeGoes

3

La forma en que he hecho esto en los proyectos en los que he tenido el problema en el pasado es auto alojar el servicio WCF dentro de un servicio de Windows.

He establecido el objeto de almacenamiento de datos dentro del servicio como un singleton que persiste durante la vida del servicio. Cada llamada de servicio WCF obtiene el singleton cada vez que necesita hacer algo con los datos.

que evitaría que se ejecuta en IIS, simplemente porque usted no tiene control directo de la vida del servicio y, por tanto, no tienen suficiente control de cuando las cosas están dispuestas y crear instancias.

+0

Acepto, he tenido innumerables inconvenientes con el control de la eliminación y creación de instancias de un servicio, ¿tiene alguna literatura sobre alojamiento web? un servicio WCF dentro de un servicio de Windows? – ToOsIK

+0

Microsoft tiene una introducción bastante decente en su [Cómo: alojar un servicio WCF en una aplicación administrada] (http://msdn.microsoft.com/en-us/library/ms731) 758.aspx) artículo; si ayuda, también actualizaré mi respuesta con algún código. –

+0

gracias por su respuesta, y por apuntarme hacia el enfoque de Win Service. Como la respuesta de Hugh es más adecuada a la pregunta que hice, acepté su respuesta correcta, aunque su comentario es una necesidad absoluta si deseo garantizar la estabilidad de mi servicio. ¡Gracias! – ToOsIK

Cuestiones relacionadas