C# 使用WCF通过Windows服务和Windows窗体应用程序进行通信

C# 使用WCF通过Windows服务和Windows窗体应用程序进行通信,c#,winforms,wcf,windows-services,C#,Winforms,Wcf,Windows Services,目前,我在Visual Studio 2017中有两个解决方案: Windows窗体应用程序 承载WCF服务类库(.dll)的Windows服务应用程序 我需要在他们之间以循环的方式交流,如下图所示。数字代表顺序 问题是,我实际上能够通过使用请求重播操作契约(由数字1和4表示)在WF和WCF应用程序之间进行通信。但我不知道如何完成第2步和第3步 WCF接口代码: namespace SmithWcfService { [ServiceContract] public inter

目前,我在Visual Studio 2017中有两个解决方案:

  • Windows窗体应用程序
  • 承载WCF服务类库(.dll)的Windows服务应用程序
  • 我需要在他们之间以循环的方式交流,如下图所示。数字代表顺序

    问题是,我实际上能够通过使用请求重播操作契约(由数字1和4表示)在WF和WCF应用程序之间进行通信。但我不知道如何完成第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( );
            }
        }
    }
    

    如果windows服务承载您的WCF服务,您只需在服务启动时传递它所需的任何内容(回调、值、设置)。您可以将windows服务的方法传递为WCF服务应该调用的
    Func

    没有你的代码,你很难知道你需要把它放在哪里。通常,它会进入您的自定义
    服务主机工厂


    带有回调的服务示例:

    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");
            }
        }
    }
    

    在什么意义上,您试图在WCF服务和windows服务之间进行通信呢?嗯,WCF基本上是围绕传输机制的一个抽象层。您定义了需要交换的数据,它负责如何交换这些数据。因此,使用WCF在前端应用程序和Windows服务之间进行通信完全没有问题@Buggfinder那么你自己的问题是沉默的!我问你对2和3的期望是什么,你刚才说你可以做到。。。交换自定义数据。从1到2的相同类型。谢谢您的回复。添加了更多代码。你能给我提供更多的解释吗?你能发布你托管WCF服务的部分吗?@JoséAugustinho添加了一个通过普通函数调用与托管WCF服务通信的示例。
    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...
            }
        }
    }