2011-03-16 15 views
6

Decir que tengo WCF contrato de servicio como esteWCF Duplex Contrato

[ServiceContract(CallbackContract = typeof(ICallback1), 
SessionMode = SessionMode.Required)] 
public interface IService1 
{ 
    // some methods 
} 

La implementación del servicio tiene InstanceContextMode.Single conjunto de InstanceContextMode y ICallback1 es algo así como

public interface ICallback1 
{ 
    [OperationContract] 
    void Report(int someValue); 
} 

Ahora, en el lado del cliente, que puede tener una clase que implementa ICallback1 como

class Callback1 : ICallback1 
{ 
    public void Report(int someValue) 
    { 
     // alert client 
    } 
} 

y crear la referencia de servicio al cliente como éste

Service1Client serviceClient = new Service1Client(new InstanceContext(new CallBack1())); 

que funciona muy bien. Ahora el problema es que tengo algunos clientes que no están interesados ​​en la devolución de llamada así que pensé que no requieren para implementar la interfaz de devolución de llamada para este tipo de clientes, así que probado este

Service1Client serviceClient = new Service1Client(null); 

y

Service1Client serviceClient = new Service1Client(new InstanceContext(null)); 

ambos informaron que el parameter cannot be null. Mi pregunta es, ¿cómo puedo crear una referencia de servicio sin pasar un objeto de devolución de llamada si el cliente no está interesado en la devolución de llamada? El único requisito es que todos los clientes deben estar hablando con el mismo servicio, pero de lo contrario puedo reestructurar el servicio. Alguna idea ?

EDIT:

también he intentado SessionMode = SessionMode.Allowed para ServiceContract en lugar de SessionMode.Required pero eso no ayuda tampoco.

+0

Parece imposible, siempre y cuando sea parte del contrato. –

+0

¿Puede el CallbackContract ser opcional? –

+0

En términos simples, la devolución de llamada se define como una parte del contrato de servicio, esto es constante. Configurar todo lo demás no cambia el contrato, por lo que parece imposible. –

Respuesta

2

Solución: elimine el CallbackContract de IService1. Crea IDuplexService1 que hereda IService1 y contiene el CallbackContract. Haga que Service1Client implemente IDuplexService1. Al crear instancias del host, llame al ServiceHost.AddServiceEndpoint para IService1 e IDuplexService1.

Cuestiones relacionadas