提供给ChannelFactory的InstanceContext包含一个不实现CallbackContractType的UserObject

时间:2011-02-11 10:10:13

标签: c# wcf

我试图让WCF双工通信正常工作,因为我不断得到“提供给ChannelFactory的InstanceContext包含一个不实现CallbackContractType的UserObject”

我知道有关于这个主题的其他帖子,但无法将它们与我的确切问题联系起来,所以我想发布自己。

继承我的代码。

我只包含了我认为相关的内容,但如果您需要其他任何内容,请与我们联系。

主机接口定义

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

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

服务的实施

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>();
      }
    }

  }

客户端代码。

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");
    }
  }

为了获得对IDataCollector接口的引用,我在主机项目中包含了对dll的引用。我想知道这是否是我的问题所在。我是否需要在客户端应用程序中重新声明回调接口?

如果您需要其他任何内容,请与我们联系。

亲切的问候

2 个答案:

答案 0 :(得分:15)

道歉。

我找到了答案。

我的问题是我正在引用包含回调接口的dll。

我应该做的是......

    class MyCallback : AshService.IDataCollectorCallback

由于

答案 1 :(得分:0)

要想把这个拿出来,这将花费很长时间。当我从示例代码中复制它时,我在回调类声明中省略了接口。