我需要构建一个在后台运行并在窗口启动时立即启动的应用程序。我需要第二个应用程序,这必须是一个 Windows 窗体,它提供状态的表示和对主应用程序的一些控制。
首先,我开始将 Windows 服务作为主要应用程序,将 Windows 窗体作为辅助应用程序,但我发现了一个严重的问题。他们如何相互沟通。所以 TCP 是我的第一个想法,但防火墙阻止了我。
我研究并找到了 WCF。显然使用 WCF 我可以在两个应用程序之间进行通信而不会太头疼,但我从未使用过 WCF 并且有两件事让我担心。
WCF 有防火墙问题? 使用 Windows 服务 <=> WCF <=> Windows 窗体是一个好方法,我的意思是,这不是一个坏习惯吗?
请帮助我,我迷路了。
最佳答案
使用 WCF 在 Windows 服务和前端应用程序之间进行通信是一种非常好的方法。我过去曾成功地使用过这种方法。
WCF 基本上是围绕传输机制的抽象层。您定义需要交换的什么数据; WCF 负责如何交换数据。 WCF 真正好的地方在于它将您的数据交换转换为形式化的方法调用。从您的角度来看,从 Windows 服务向应用程序发送状态消息就像进行方法调用一样简单。在幕后,WCF 序列化消息,将其发送到远程端点,并在交换完成后将控制权返回给您。
WCF 在同一台机器上或跨机器运行良好。如果你在同一台机器上,NetNamedPipeBinding可能是您想使用的。对于跨机器通信,有多种选项可供选择,包括 NetTcpBinding .我找到了这个 flow chart在选择绑定(bind)时很有帮助。
.
为了全面披露,我对 WCF 感到沮丧,原因有以下三个:
- 与 WCF 相关的陡峭学习曲线。
- 缺乏与 Visual Studio IDE 的无缝集成。
- 表现。
学习曲线是一次性成本,但可能会很大。当我大约 3 年前最后一次使用 WCF 时,Visual Studio 并没有让它易于使用,这只会加剧我的学习曲线。今天,Visual Studio 可能会让这一切变得非常简单;我只是不确定。不过,我真正感到沮丧的是性能。根据我的经验,WCF 在您第一次调用方法时很慢,此后几乎是瞬时的。我的软件的用户不止一次对性能发表评论,所以我现在使用基于 TCP 的解决方案来缓解这个问题。
至于您的特定问题,如果您的服务和应用程序在同一系统上运行,则防火墙应该不是问题。只需确保使用本地主机地址 (127.0.0.1)。如果它们在不同的系统上,WCF 可以通过其中一个 http 绑定(bind)帮助缓解防火墙问题。
希望对您有所帮助。
关于c# - 使用 WCF 的 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17457079/