2010-11-02 20 views
5

Actualmente estoy tratando de entender los servicios de WCF para un entorno de desarrollo ASP.NET, y creo que me está yendo bien, salvo por una cosa que me ha dejado perplejo.¿Cómo puedo llamar al constructor de mi servicio WCF?

Básicamente, Tengo un servicio de WCF establecido (Tomemos el defecto, con un constructor añadido):

public class MyService : IMyService 
{ 
    public MyService() { /* blah */ } 
    public DoWork() { /* blah */ } 
} 

La interfaz IMyService define el método DoWork() como [OperationContract], como debe ser.

Así que este servicio se hace referencia en otro proyecto (digamos un [Unidad] Proyecto de prueba), a través de Agregue la referencia de servicio en la interfaz de usuario VS2010. Esto crea una referencia a MyServiceClient que expone mis métodos de servicio WCF, como debería.

Sin embargo, cuando hago esto en mi proyecto de prueba:

ServiceReference.IMyService service; 
service = new ServiceReference.MyServiceClient(); 

... el constructor MyService() no recibe llamados, básicamente porque estoy instancias de un MyServiceClient, no un MyService per se.

¿Cómo hago para llamar al constructor? Estoy planeando usar eso para fines de inicialización (¿tal vez tomar una capa en una implementación por niveles, por ejemplo?).

Respuesta

6

Se llamará a ese constructor en el servidor cuando realiza su solicitud desde el cliente.

Crear una "referencia" a un servicio web (y luego usar las clases de cliente) es muy diferente a hacer referencia a un .DLL normal. Todo su código de servicio se ejecutará en el lado del servidor, pero no hasta que se invoque el servicio ...

+0

Básicamente, usted está diciendo que en lugar de _Add Service Reference_, debería simplemente ir con una buena referencia _Add_ al proyecto de servicio, y luego acceder directamente a las clases de servicio. –

+3

No, agregar una referencia de servicio es correcto ... pero el constructor en su clase de servicio no se ejecuta como parte de su código local; se ejecuta en su servidor IIS cuando * llama * al servicio. Se * invocará * antes de ejecutar cualquiera de sus métodos de servicio, solo que no cuando cree su objeto cliente. –

+0

Gotcha. Estaba trabajando con su solución cuando me di cuenta de que aún no había llamado a ningún método de servicio en mi proyecto de prueba. : D Gracias! –

1

La única forma de llamar al constructor del lado del servidor para cada solicitud es establecer el InstanceContextMode en PerCall (en el atributo ServiceBehavior).

+1

Correcto, pero creo que te refieres al atributo ServiceBehavior. :) –

Cuestiones relacionadas