2011-08-30 20 views
5

Deseo hacer algo justo después de que mi servicio WCF haya comenzado. ¿Cómo puede hacerlo?Haga algo cuando mi servicio WCF comenzó

De hecho, debería actualizar alguna variable de mi servicio cada 10 minutos. Así que puse mi código de actualización en un hilo. Pero no sé cómo comenzar este hilo cuando comenzó el servicio (¿Hay algo que le haya gustado al evento Form_Load en los servicios de WCF?)

+1

¿Cómo se aloja su servicio wcf? – Jan

Respuesta

2

Es difícil mantener un hilo ejecutándose en un servidor. Tan pronto como finaliza la última sesión, la aplicación se apaga. Algunos proveedores de hosting también reciclan el grupo de aplicaciones en un horario que elimina cualquier posibilidad de mantener un hilo ejecutándose.

Dejando eso de lado, los Servicios de WCF en realidad no se ejecutan. Actúan como páginas web activadas por una solicitud. El lugar sensato para agregar el código de inicio sería en su Application_Start en Global.asax. Se llamaría a esto una vez cuando se inicie la aplicación (se realiza la primera solicitud).

Si prefiere hacer algo en cada solicitud de sus servicios, puede conectar el evento Application_BeginRequest también en Global.asax.

+0

'Global.asax'? ;) – Marc

+0

@Marc: P - corregido – TheCodeKing

+0

¿Qué sucede si aloja WCF en un servicio de Windows o en una aplicación autohospedada? No hay un archivo .asx global allí y no actúa como una aplicación web en ese sentido. Además, WCF no puede usar sesiones en absoluto. – oleksii

5

Normalmente, no hay partes de su servicio WCF que estén "colgando" en la memoria listas para hacer algo ... WCF es NO ASP.NET!

La configuración por defecto cuando se aloja en IIS es la siguiente:

  • IIS escucha en un puerto/URL específica para una solicitud - No hay un solo rastro de su servicio WCF en cualquier lugar de la memoria

  • cuando llega una primera solicitud, IIS activará un ServiceHost - una clase que puede "albergar" un servicio

  • Este host de servicio observará que la solicitud ha entrado y, dependiendo de la URL de destino, decidirá e qué clase de servicio instanciar para manejar esta solicitud. a continuación, se crea la clase de servicio (su implementación del servicio) y el método apropiado en esa clase de servicio se llama y ejecutado, y una vez que eso se ha completado, la clase de servicio está dispuesto

Así que, básicamente, hay dos puntos en los que puede enganchar en:

  1. puede crear su propia clase personalizada ServiceHost que va a hacer algo cuando se crea una instancia

  2. se puede añadir algo de código "inicialización" a cada uno de su clase de servicio metho ds resuelva sus necesidades

+1

¿Qué pasa con otros tipos de alojamiento? Esto es específico de IIS. En el alojamiento del servicio Win, por ejemplo, OP puede crear un temporizador y usar un evento tic para hacer eso. – oleksii

+0

@oleksii: cuando se autohospeda, sí, tiene un poco más de control, pero aún así, básicamente puede ajustar el host de servicio que obtiene una instancia bajo su control, o hacer algo en el método de servicio, cuando se llama –

+0

¿Debería alguien hacer entonces si quiere algo que "se quede solo" en la memoria? – AjaxLeung

0

Puede crear un servicio de instancia, que será llamar al constructor en el inicio de su servicio:

[ServiceContract] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class InstanceService 
{ 
    private int _intValue; 

    public InstanceService() 
    { 
     _intValue = 456; 
    } 

    [OperationContract] 
    public int GetData() 
    { 
     return _intValue; 
    } 
} 

Invocando GetData() en este servicio devolverá un número entero con un valor de 456.

+3

Tal instancia de servicio singleton tiene dos inconvenientes principales: 1) serializa las solicitudes y las maneja una tras otra, creando un cuello de botella potencialmente masivo - o 2) requiere una programación completamente multi-threading, algo que no es nada fácil y bastante propenso a errores. Intentaré evitar los singletons siempre que sea posible –

+0

Tienes razón, olvidé mencionar que esto solo será útil en situaciones muy específicas, y no es algo que deba considerarse fácilmente. – CodeCaster

0

Esto se puede lograr si puede controlar cómo alojar esto. Si puede, aloje su servicio WCF como un servicio de Windows o un ejecutable ad hoc. Entonces puedes lograr lo que quieras con facilidad.Si está obligado a alojar IIS, debe hacer lo que otros han sugerido y manejarlo por solicitud.

Lea en el alojamiento autónomo wcf si no se requiere IIS.

Cuestiones relacionadas