【发布时间】:2010-09-10 05:39:54
【问题描述】:
使用 .Net 与服务交互的最佳方式是什么(即大多数托盘应用程序如何与其服务器通信)。如果这种方法也是跨平台的,那将是首选(在 Mono 中工作,所以我猜远程处理已经过时了?)
编辑:
忘了说,我们仍然需要在现场支持 Windows 2000 机器,所以 WCF 和 .Net 2.0 以上的任何东西都行不通。
【问题讨论】:
标签: c# .net windows-services service mono
使用 .Net 与服务交互的最佳方式是什么(即大多数托盘应用程序如何与其服务器通信)。如果这种方法也是跨平台的,那将是首选(在 Mono 中工作,所以我猜远程处理已经过时了?)
忘了说,我们仍然需要在现场支持 Windows 2000 机器,所以 WCF 和 .Net 2.0 以上的任何东西都行不通。
【问题讨论】:
标签: c# .net windows-services service mono
远程处理是一种选择,但它不是跨平台的。其他一些方法是使用命名管道、IPC 或内核事件。
【讨论】:
有趣的是,我打算建议远程处理! Mono 1.0 Release Notes(来自 archive.org,因为缺少原始位置)提到 System.Runtime.Remoting.dll 作为受支持的库,并没有说明任何已知问题。
如果远程处理不可用,那么您可能必须实现自己的 TCP 消息帧协议。 Windows 没有等效的 UNIX 域套接字用于在同一台机器上进行通信。
【讨论】:
大多数具有 GUI 组件的服务都以指定用户身份运行,并允许访问桌面。这使您可以通过 COM 或 .NET 访问它,但只能在本地访问(除非您想变得复杂)
就我个人而言,我在服务上打开了一个普通的旧套接字 - 它的跨平台,允许多个客户端,允许任何应用程序访问它,不依赖 Windows 安全性为其打开,并允许您的 GUI用你喜欢的任何语言编写(因为一切都支持套接字)。
对于托盘应用程序,您需要一个简单的协议进行通信 - 您不妨使用 REST 样式系统向其发送命令,并将 XML (yuk) 或自定义数据格式流式传输回来。
【讨论】:
让您的服务使用普通的旧 TCP 流套接字在预定义端口上侦听 127.0.0.1。从您的桌面应用程序连接到该端口。
它非常简单,而且完全跨平台。
【讨论】:
请注意,如果您计划最终在 Windows Vista 或 Windows Server 2008 上进行部署,那么今天可以完成的许多方法都行不通。这是因为引入了一种称为“会话 0 隔离”的新安全功能。
现在,大多数 Windows 服务已移至会话 0 中运行,以便将它们与系统的其余部分正确隔离。对此的扩展是,第一个登录系统的用户不再被放置在 Session #0 中,他们被放置在 Session 1 中。因此,隔离将破坏在服务和桌面应用程序之间进行某些类型通信的代码。
在服务和应用程序之间进行通信时,今天编写可在 Vista 和 Server 2008 上运行的代码的最佳方法是使用适当的跨进程 API,如 RPC、命名管道等。不要使用 SendMessage/PostMessage因为这将在 Session 0 Isolation 下失败。
http://www.microsoft.com/whdc/system/vista/services.mspx
现在,根据您的要求,您可能会遇到麻烦。对于跨平台问题,我不确定是否支持远程处理。您可能需要下拉并一直返回到套接字:http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx
【讨论】:
如果这是一个托盘应用程序,而不是一个真正的服务,请注意在使用管道或 TCP/IP 时如何设置通信。如果多个用户登录到一台机器(Citrix、远程桌面),并且每个用户启动一个托盘应用程序“服务”,那么您可能会遇到多个进程试图使用同一个众所周知的端口或管道的情况。当然,如果您不打算支持多个管道,或者如果您拥有真正的服务而不是在每个用户 shell 中运行的托盘应用程序,这当然不是问题。
【讨论】:
你们中有人真的尝试过使用 Mono 进行远程处理吗?它工作得很好。您可能会遇到一些极端情况,但这不太可能。只需不时测试您的应用程序的跨平台(MS.Net Mono)远程处理,以捕捉任何可能的故障。从最近的 Mono 开始,2.4.2 是最新的。
【讨论】: