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

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

  1. Windows 窗体应用程序
  2. 托管 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 的同一类型。

标签: c# winforms wcf windows-services


【解决方案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 服务通信的示例。
猜你喜欢
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多