Предоставление InstanceContext для ChannelFactory содержит UserObject, который не реализует CallbackContractType - PullRequest
6 голосов
/ 11 февраля 2011

Я пытаюсь установить дуплексную связь WCF, работаю, и я изо всех сил пытаюсь получить "InstanceContext, предоставляющий ChannelFactory, содержит UserObject, который не реализует CallbackContractType"

Я знаю, что есть другие сообщения по темено не мог связать их с моей конкретной проблемой, поэтому думал, что я отправлю сам.

Вот мой код.

Я включил только те биты, которые я считаю актуальными, но, пожалуйста, дайте мне знать, если вытребовать что-либо еще.

Определения интерфейса хоста

[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 ]

15 голосов
/ 11 февраля 2011

Извинения.

Я разработал ответ.

Моя проблема заключалась в том, что я ссылался на dll, содержащую интерфейс обратного вызова.

Что я должен был сделать, это ....

    class MyCallback : AshService.IDataCollectorCallback

Спасибо

Ash

0 голосов
/ 13 мая 2017

Потребовалось бы целую вечность, чтобы понять это. Я пропустил интерфейс в своем объявлении класса обратного вызова, когда скопировал его из примера кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...