使用 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 的期望,而你刚刚说你可以做到...如果 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 窗体应用程序进行通信的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 Windows 服务中托管(自托管)WCF 服务并通过 http 公开它吗?
仅在通过 Windows 服务使用 WCF 时“无端点侦听”