Вы не можете просто запустить службу WCF с контрактом обратного вызова и сразу попытаться выполнить обратный вызов клиента. Клиентов пока нет.
В вашем коде я вижу, как вы вручную создаете MyService
и пытаетесь выполнить метод обратного вызова. Это просто не сработает. Если вы хотите использовать метод GetCallbackChannel
, то это нужно делать, когда фактически существует канал - то есть в контексте фактической операции, вызываемой удаленным клиентом WCF. В противном случае текущее значение OperationContext
отсутствует, и вы получите исключение нулевой ссылки, поскольку OperationContext.Current
возвращает null
.
Обратные вызовы предназначены для использования с длительными операциями обслуживания. Например:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService
{
// One-way method
public void PerformLongRunningOperation()
{
var callback =
OperationContext.Current.GetCallbackChannel<IMyCallbackContract>();
var result = DoLotsOfWork();
callback.LongRunningOperationFinished(result);
}
}
Чтобы проверить это, вам фактически нужно создать клиента - начать новый проект, добавить ссылку на эту службу, реализовать обратный вызов, который генерирует импортер, создать InstanceContext
с обратным вызовом, создать прокси-клиент клиента с помощью этого InstanceContext
и, наконец, вызовите его PerformLongRunningOperation
метод.
Если вы пытаетесь разработать реализацию pub / sub, в которой клиенты на самом деле не инициируют операции, а просто регистрируют себя для получения обратного вызова, взгляните на эту страницу: Использование контрактов обратного вызова в WCF для асинхронной публикации / Подписаться Event-Style Communication .