使用 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 窗体应用程序进行通信的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight+WCF项目Https配置

服务器已拒绝客户端凭据,WCF 作为 Windows 服务

我可以在 Windows 服务中托管(自托管)WCF 服务并通过 http 公开它吗?

仅在通过 Windows 服务使用 WCF 时“无端点侦听”

使用 Windows 身份验证的 IIS 托管 WCF 服务和 SQL 查询

是否可以通过 httpwebrequest 使用 WCF 服务(托管为 Windows 服务托管)?