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

Posted

技术标签:

【中文标题】使用 WCF 通过 Windows 服务和 Windows 窗体应用程序进行通信【英文标题】:Using WCF to communicate over Windows service and Windows forms applications 【发布时间】:2018-11-21 21:48:47 【问题描述】:

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

    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( );
        
    

【问题讨论】:

在什么意义上你试图在 WCF 服务和 Windows 服务之间进行通信 嗯,WCF 基本上是围绕传输机制的一个抽象层。您定义需要交换哪些数据,它负责如何交换这些数据。因此,使用 WCF 在前端应用程序和 Windows 服务之间进行通信完全没有问题。 @BugFinder 那你自己的问题就哑了!我在问你对 2 和 3 的期望,而你刚刚说你可以做到... 交换自定义数据。从 1 到 2 的同一类型。 【参考方案1】:

如果 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...
        
    

【讨论】:

感谢您的回复。添加了更多代码。能否请您提供更多解释? 您可以发布您托管 WCF 服务的部分吗? @JoséAugustinho 添加了一个通过普通函数调用与托管 WCF 服务通信的示例。

以上是关于使用 WCF 通过 Windows 服务和 Windows 窗体应用程序进行通信的主要内容,如果未能解决你的问题,请参考以下文章