Я разрабатываю службу WCF с обратным вызовом, но моя реализация функции обратного вызова никогда не вызывается. И я не совсем понимаю сгенерированный сервисный прокси, поэтому, пожалуйста, помогите.
Вот сценарий: на стороне сервера я определил интерфейс службы IMyService и интерфейс обратного вызова IMyServiceCallback, я также реализовал IMyService в проекте сервера. Помимо серверного проекта, у меня наверняка есть еще один клиентский проект, к которому я добавил ссылку на службу в VS. И я реализовал интерфейс IMyServiceCallback на стороне клиента. Таким образом, здесь возникает проблема: когда я отлаживаю его, функция никогда не входит в мою реализацию IMyServiceCallback и, конечно, желаемый результат никогда не выходит.
И вот тут я запутался: когда я добавил ссылку на службу на стороне клиента, она фактически сгенерировала три локальных интерфейса: IMyService, IMyServiceCallback и IMyServiceChannel плюс прокси-класс клиента. И в моей локальной реализации IMyServiceCallback я объявил класс для реализации локального интерфейса IMyServiceCallback, а не со стороны службы. Может ли это быть проблемой? Почему существуют два объявления интерфейса в разных проектах (и, следовательно, в разных пространствах имен)? Причина, по которой я реализую интерфейс на стороне клиента, заключается в том, что, если бы я реализовал интерфейс на стороне сервера, он выдает ошибку: «InstanceContext, предоставленный ChannelFactory, содержит объект UserObject, который не реализует ошибку CallbackContractType», когда я пытался вызвать службу. И еще одна сбивающая с толку часть: на стороне сервера, если я объявлю имя интерфейса обратного вызова как IMyCallback или что-то еще, вместо IMyServiceCallback, сгенерированный интерфейс на стороне клиента будет по-прежнему IMyServiceCallback, который является именем интерфейса службы плюс суффикс "Обратный звонок". И в этой ситуации я также получил «InstanceContext, предоставленный ChannelFactory, содержит UserObject, который не реализует ошибку CallbackContractType».
Полагаю, что я неправильно понял «добавить ссылку на сервис» и то, как я должен реализовать интерфейс (какой реализовать). Кто-нибудь может мне помочь? Спасибо!
Обновлен:
Я как-то исправил проблему. Во-первых, две декларации в порядке, желательно. Локальный клиент должен будет реализовать локальный интерфейс, который генерируется при добавлении ссылки на службу. И моя проблема заключалась в том, что я также определил DataContract, но в сгенерированном справочном файле его не было. Это может быть связано либо с тем, что я добавил сборку проекта службы в качестве ссылки (кто-то сказал, что в этом случае добавить ссылку на службу не будет генерировать Datacontract), либо из-за отсутствия атрибута DataMember. Но в любом случае, после того, как я исправил обе части, функция теперь работает.