2011-02-11 14 views
6

Estoy tratando de hacer que la comunicación dúplex WCF funcione y estoy luchando porque sigo obteniendo "El InstanceContext brindado a ChannelFactory contiene un UserObject que no implementa el CallbackContractType"El InstanceContext proporcionado a ChannelFactory contiene un UserObject que no implementa el CallbackContractType

Sé que hay otras publicaciones sobre el tema, pero no pude relacionarlas con mi problema exacto, así que pensé en publicarlas.

Aquí está mi código.

Solo he incluido los bits que creo que son relevantes, pero házmelo saber si necesitas algo más.

Interfaz de host definiciones

[ServiceContract(CallbackContract = typeof(IDataCollectorCallback), SessionMode = SessionMode.Required)] 
    public interface IDataCollector 
    { 
    [OperationContract(IsOneWay = true)] 
    void GetData(); 
    } 

    public interface IDataCollectorCallback 
    { 
    [OperationContract(IsOneWay = true)] 
    void returnData(); 
    } 

implementación del servicio

public class DataCollector : IDataCollector 
    { 
    public void GetData() 
    { 

     Console.WriteLine("Getting data"); 
     Console.WriteLine("Waiting"); 
     System.Threading.Thread.Sleep(10000); 
     Console.WriteLine("Sending Data back"); 
     Callback.returnData(); 


    } 

    IDataCollectorCallback Callback 
    { 
     get 
     { 
     return OperationContext.Current.GetCallbackChannel<IDataCollectorCallback>(); 
     } 
    } 

    } 

El código de cliente.

class Program 
    { 
    static void Main(string[] args) 
    { 
     // while (true) 
     //{ 
     Console.WriteLine("Press enter to trigger data collection"); 
     Console.ReadLine(); 
     InstanceContext context = new InstanceContext(new MyCallback()); 


     AshService.DataCollectorClient svc = new AshService.DataCollectorClient(context); 

     svc.GetData(); 
     Console.WriteLine("awaiting data coming back"); 
     Console.ReadLine(); 
     //} 
    } 

    } 

    class MyCallback : IDataCollectorCallback 
    { 
    public MyCallback() 
    { 
    } 

    public void returnData() 
    { 
     Console.WriteLine("Got Data back from the server"); 
    } 
    } 

para obtener una referencia a la interfaz IDataCollector He incluido una referencia a la DLL en el proyecto de acogida. Me pregunto si aquí es donde radica mi problema. ¿Debo volver a encriptar la interfaz de devolución de llamada en la aplicación cliente?

Háganme saber si necesita algo más.

Saludos cordiales

Ash

Respuesta

14

Disculpas.

He encontrado la respuesta.

Mi problema es que estaba haciendo referencia a la dll que contiene la interfaz de devolución de llamada.

Lo que debería haber hecho es eso ....

class MyCallback : AshService.IDataCollectorCallback 

Gracias

Ash

0

Habría tomó por siempre a la forma de saberlo. Dejé la interfaz en mi declaración de clase de devolución de llamada cuando la copié del código de muestra.

Cuestiones relacionadas