Связь между WPF и размещенной службой WCF - PullRequest
0 голосов
/ 17 января 2019

У меня есть консольное приложение, которое запускает службу WCF, и небольшое приложение WPF.Я пытаюсь показать окно сообщения в приложении WPF всякий раз, когда метод в службе WCF вызывается для целей тестирования.Я основал свой код на этом ответе, но SynchronizationContext имеет значение null.Как это исправить?Или есть другие / лучшие способы сделать это?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Может быть, вы можете попробовать 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;
    }
}

Чтобы зарегистрировать инспектора, вам нужно использовать конечную точку поведения

  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


        }
0 голосов
/ 17 января 2019

Использование 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).

Существуют другие способы вызова служб-клиентов службами, эта ссылка показывает несколько других.

...