2012-06-13 39 views
5

La pregunta es sobre los datos estáticos en una clase.El ciclo de vida del servicio WCF alojado en IIS

Si se trata de una clase de servicio, entonces creo que el modo de creación de instancias es importante. ¿Pero qué sucede si tengo otra clase singleton independiente?

¿Puedo crear un objeto allí que estará disponible para todas las llamadas por llamada? ¿El IIS tiene ese dll en memoria para siempre, de modo que el singleton estará todo el tiempo en la memoria?

¿Cómo puedo hacer que algún objeto esté disponible para todas las llamadas al cliente WCF? ¿Es posible hacer eso en IIS o debería alojar el servicio WCF en un servicio de Windows?

Respuesta

2

Problema comprobado en mi IIS local.

Este es mi código.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 

    public static int _counter = 0; 

    public string GetData() 
    { 
     _counter++; 
     return _counter.ToString(); 
    } 
} 

Con la configuración predeterminada de IIS, se ejecuta un proceso por extracción de la aplicación y este código funciona como se esperaba. El resultado se incrementa en cada llamada de servicio.

Esto tiene sentido porque InstanceContextMode no administra el enhebrado. Solo controla el tiempo de vida de InstanceContext de por vida.

Sabiendo que todavía no podemos considerar el uso de variables estáticas para datos variables como mejores prácticas. IIS podría configurarse como "Jardín web". Esa configuración significa que se permite más de un proceso de trabajo por grupo de aplicaciones y cada proceso tendrá su propia copia de la variable estática.

http://www.iis.net/ConfigReference/system.applicationHost/applicationPools

Cómo puedo hacer que un objeto esté disponible para todas las llamadas de los clientes de WCF? ¿Es posible hacer eso en IIS o debería alojar el servicio WCF en un servicio de Windows ?

Los objetos se deben almacenar en un almacenamiento persistente como base de datos o caché distribuida. IIS sigue siendo un gran anfitrión de servicios y ofrece todo lo que el servicio de Windows puede hacer y mucho más.

2

se proporcionan algunos consejos basados ​​en el contexto corta que ya ha proporcionado

  • Si usted tiene una clase estática, el estado se mantiene siempre y cuando usted tiene acceso al mismo proxy WCF. El host (servicio IIS o Windows) no importa.

  • Si desea mantener 'variables estáticas globales' entre las solicitudes de los clientes, ¿por qué no las almacena en un repositorio (archivo/base de datos/etc.)?

  • Si desea conservar el estado para cada solicitud de cliente, puede consultar "Servicios de WCF duraderos" (related thread). Lo he usado antes, por lo que funciona siempre que su escenario exija un comportamiento similar a la sesión y esté consciente del costo de rendimiento.

Espero que esto ayude.

+0

No entiendo el primer punto (¿qué quiere decir exactamente: el mismo proxy wcf?) El segundo punto, porque quiero cargar algunos datos de db y servirlos a los clientes (la velocidad es relevante). Por otro lado, los servicios duraderos, hasta donde yo sé, usan las cookies para almacenar los datos de la sesión del cliente. ¿Así que elegir un wcf en un servicio de Windows es la mejor opción? – John

+1

@John - En el primer punto, por 'WCF proxy', quise decir el objeto creado en el lado del cliente para acceder al servicio. Por lo tanto, supongamos que utiliza un proxy WCF para realizar una serie de llamadas de servicio, la clase estática (en el lado del servidor) seguirá siendo la misma. No lo aconsejaría a menos que las llamadas de servicio estén relacionadas. Sobre su segunda pregunta, me gusta la idea de usar un servicio de Windows para mantener variables globales. No lo he usado antes, pero inténtalo. – Channs

+0

Lo entiendo, lo sé. Gracias por su sugerencia. – John

Cuestiones relacionadas