Как и DxCK, тип, передаваемый в OperationContext.Current.GetCallbackChannel <T
> (), должен быть точно такого же типа, который вы указали в атрибуте [ServiceContract] интерфейса, который реализует служба.
Однако мне нужно использовать другой интерфейс для обратных вызовов, чтобы я мог добавить методы Begin / End, необходимые для поддержки обратных вызовов aysc.
Итак, во-первых, мой новый интерфейс обратного вызова.
[ServiceContract]
public interface IClientWithAsyncMethods : IClient
{
[OperationContract(
AsyncPattern = true,
Action = "ReceiveMessage",
ReplyAction = "ReceiveMessageResponse")]
IAsyncResult BeginReceiveMessage(SimMessage message,
AsyncCallback callback, object asyncState);
void EndReceiveMessage(IAsyncResult asyncResult);
}
Затем нужно определить новый интерфейс для моей службы для реализации:
[ServiceContract(CallbackContract = typeof(IClientWithAsyncMethods))]
public interface IEngineManagerWithAsyncCallbacks : IEngineManager
{
}
Единственное изменение, касающееся использования нового интерфейса обратного вызова в качестве CallbackContract, это нормально, поскольку IClientWithAsyncMethods является подтипом IClient.
Затем последним шагом является изменение используемой реализации serve на интерфейс службы:
- Изменить тип интерфейса, который реализует служба
- Передать новый интерфейс в ServiceHost.AddServiceEndpoint () (и / или отредактировать файлы конфигурации WCF)
- Использование IClientWithAsyncMethods при вызове OperationContext.Current.GetCallbackChannel
<IClientWithAsyncMethods
> ()
Остальное просто вызывает метод aysc обычным способом.