Использование WCF для связи через службу Windows и приложения форм Windows - PullRequest
0 голосов
/ 12 июня 2018

В настоящее время у меня есть 2 решения в Visual Studio 2017:

  1. Приложение Windows Forms
  2. Приложение-служба Windows, содержащее библиотеку классов службы WCF (.dll)

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

enter image description here

Проблема в том, что я могу общаться между приложением WF и WCF, используя операцию запроса-воспроизведениядоговор (представлен номерами 1 и 4).Но я не уверен, как выполнить шаги 2 и 3.

Код для интерфейса WCF:

namespace SmithWcfService {
    [ServiceContract]
    public interface ISmithWcfService {
        [OperationContract]
        void SendRequest( ); //Operation called by Windows Forms
    }
}

Код для реализации интерфейса WCF

namespace SmithWcfService {
    public class SmithWcfService : ISmithWcfService {
        public void SendRequest( ) {
            //Ok, now I need to call Windows service application
        }
    }
}

Код службы Windows

namespace SmithWindowsService {
    static class Program {
        static void Main( ) {
            ServiceBase[ ] ServicesToRun;
            ServicesToRun = new ServiceBase[ ] {
                new SmithWindowsService( )
            };
            ServiceBase.Run( ServicesToRun );
        }
    }
}

namespace SmithWindowsService {    
    public partial class SmithWindowsService : ServiceBase {
        private ServiceHost host;

        public SmithWindowsService( ) {
            InitializeComponent( );
        }

        protected override void OnStart( string[ ] args ) {
            host = new ServiceHost( typeof( SmithWcfService.SmithWcfService ) );
            host.Open( );
        }
    }
}

1 Ответ

0 голосов
/ 12 июня 2018

Если служба Windows размещает вашу службу WCF, вы можете просто передать все, что ей нужно (обратные вызовы, значения, настройки) при запуске службы.Вы можете передать метод службы Windows как Func<Input2, Output3>, который должен вызывать сервис WCF.

Без вашего кода трудно сказать , где вы должны поместить его.Обычно это входит в ваш пользовательский ServiceHostFactory.


Пример услуги с обратным вызовом:

namespace SmithWcfService 
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    public class SmithWcfService : ISmithWcfService 
    {
        private Func<string, int> callback;

        public SmithWcfService(Func<string, int> callback)
        {
            this.callback = callback;
        }

        public void SendRequest() 
        {
            //Ok, now I need to call Windows service application:
            var output = this.callback("input");
        }
    }
}

Пример хостинга:

namespace SmithWindowsService 
{    
    public partial class SmithWindowsService : ServiceBase 
    {
        private ServiceHost host;

        public SmithWindowsService( ) 
        {
            InitializeComponent( );
        }

        protected override void OnStart(string[] args) 
        {
            var instance = new SmithWcfService.SmithWcfService(this.SomeMethodYouWantToCallIn);
            host = new ServiceHost(instance, new Uri("your.url.com"));
            host.Open( );
        } 

        private int SomeMethodYouWantToCall(string data)
        {
            // do things...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...