Возможно, вы могли бы попробовать ClientMessageInspector, его AfterReceiveReply будет вызываться каждый раз, когда клиент получает сообщение.
public class MyClientMessageInspector : IClientMessageInspector
{
Your message box
public void AfterReceiveReply(ref Message reply, object correlationState)
{
show message in your message box
}
public MyClientMessageInspector ( ){
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
return null;
}
}
Чтобы зарегистрировать инспектора, вам нужно использовать endpointBehavior
public class MyEndpointBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add( new MyClientMessageInspector();
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
, а затем добавить поведение к вашему клиенту.
using (ChannelFactory<IService> ChannelFactory = new ChannelFactory<IService>("myservice"))
{
ChannelFactory.Endpoint.EndpointBehaviors.Add(new MyEndpointBehavior());
IService service = ChannelFactory.CreateChannel();
// call method
}
Используйте SignalR . Много информации здесь и здесь . Эта статья также выглядит очень хорошо.
Что касается фактического кода, создайте службу WCF и используйте NuGet, чтобы добавить ссылку на SignalR, а затем добавьте класс-концентратор:
public class ServiceMonitorHub : Hub
{
}
Вам также потребуется добавить класс запуска Owin для запуска концентратор SignalR:
[assembly: OwinStartup(typeof(YourNamespace.SignalRStartup))]
namespace YourNamespace
{
public class SignalRStartup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
Затем ваши обработчики службы могут получить ссылку на этот концентратор и отправлять сообщения всем подключенным к нему клиентам:
public class Service1 : IService1
{
public string GetData(int value)
{
// send msg to clients
var hub = GlobalHost.ConnectionManager.GetHubContext<ServiceMonitorHub>();
hub.Clients.All.BroadcastMessage();
return string.Format("You entered: {0}", value);
}
Затем ваш клиент WPF подключается к этому серверу SignalR и перехватывает обработчики для получения сообщений, отправляемых обработчиками служб, в этом примере содержится обработчик кнопок, который вызывает службу, а также подключение к концентратору SignalR для получения сообщений, возвращающихся назад:
public partial class MainWindow : Window
{
private HubConnection Connection;
private IHubProxy HubProxy;
public MainWindow()
{
InitializeComponent();
Task.Run(ConnectAsync);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
using (var service = new ServiceReference1.Service1Client())
service.GetData(1);
}
public async Task ConnectAsync()
{
try
{
this.Connection = new HubConnection("http://localhost:59082/");
this.HubProxy = this.Connection.CreateHubProxy("ServiceMonitorHub");
HubProxy.On("BroadcastMessage", () => MessageBox.Show("Received message!"));
await this.Connection.Start();
}
catch (Exception ex)
{
}
}
}
}
Обратите внимание, что клиентам необходим пакет NuGet SignalR.Clients (в отличие от просто SignalR).
Существуют и другие способы, которыми сервисы могут вызывать клиентов-концентраторов, эта ссылка показывает несколько других.