Я пытаюсь, чтобы мой клиент WCF получил информацию от обратного вызова.Я создал клиентскую библиотеку, которую любой клиент WCF может использовать для подключения к моей службе WCF.Я не уверен, должен ли я реализовать Callback в клиентской библиотеке или в самом клиенте WCF.
Я попытался создать event
, который будет запущен путем вызова метода OnNotification(...)
из обратного вызова.Однако его нельзя вызвать из метода обратного вызова, и я не уверен, почему.
Вот моя клиентская библиотека, используемая для подключения к службе WCF:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel; //needed for WCF communication
namespace DCC_Client
{
public class DCCClient
{
private DuplexChannelFactory<ServiceReference1.IDCCService> dualFactory;
public ServiceReference1.IDCCService Proxy;
public DCCClient()
{
//Setup the duplex channel to the service...
NetNamedPipeBinding binding = new NetNamedPipeBinding();
dualFactory = new DuplexChannelFactory<ServiceReference1.IDCCService>(new Callbacks(), binding, new EndpointAddress("net.pipe://localhost/DCCService"));
}
public void Open()
{
Proxy = dualFactory.CreateChannel();
}
public void Close()
{
dualFactory.Close();
}
/// <summary>
/// Event fired an event is recieved from the DCC Service
/// </summary>
/// <param name="e"></param>
protected virtual void OnNotification(EventArgs e)
{
if (Notification != null)
{
Notification(this, e);
}
}
}
public class Callbacks : ServiceReference1.IDCCServiceCallback
{
void ServiceReference1.IDCCServiceCallback.OnCallback(string id, string message, Guid key)
{
//Can't call OnNotification(...) here?
}
}
}
OnNotification(...)
не может быть вызван в методе обратного вызова.
Вот пример того, как мой WCF-клиент может быть реализован с использованием EventHandler:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DCC_Client;
namespace Client_Console_Test
{
class Program
{
private static DCCClient DCCClient;
static void Main(string[] args)
{
try
{
DCCClient = new DCCClient();
DCCClient.Notification += new EventHandler(DCCClient_Notification);
DCCClient.Open();
DCCClient.Proxy.DCCInitialize();
Console.ReadLine();
DCCClient.Proxy.DCCUninitialize();
DCCClient.Close();
}
catch (Exception e)
{
DCCClient.Log.Error(e.Message);
}
}
static void DCCClient_Notification(object sender, EventArgs e)
{
//Do something with this event
}
}
}
Это правильный способ передачи информации обратного вызовак моему клиенту WCF?Я чувствую, что добавление EventHandler является избыточным, и я должен просто использовать сам обратный вызов.Правильно ли я реализовал функцию обратного вызова в моей клиентской библиотеке или это должно быть сделано в каждом клиенте WCF?
Заранее спасибо.