17

使用 .Net 与服务交互的最佳方式是什么(即大多数托盘应用程序如何与其服务器通信)。如果这种方法也是跨平台的(在 Mono 中工作,所以我猜远程处理已经过时了?)


编辑:

忘了提一下,我们仍然必须在现场支持 Windows 2000 机器,所以 WCF 和任何高于 .Net 2.0 的东西都行不通。

4

7 回答 7

18

请注意,如果您计划最终在 Windows Vista 或 Windows Server 2008 上进行部署,那么今天可以完成的许多方法都行不通。这是因为引入了一种称为“会话 0 隔离”的新安全功能。

大多数 Windows 服务现在已移至会话 0 中运行,以便将它们与系统的其余部分正确隔离。对此的扩展是,第一个登录系统的用户不再被放置在 Session #0 中,他们被放置在 Session 1 中。因此,隔离将破坏在服务和桌面应用程序之间进行某些类型通信的代码。

今天,在服务和应用程序之间进行通信时,编写可在 Vista 和 Server 2008 上运行的代码的最佳方法是使用适当的跨进程 API,如 RPC、命名管道等。不要使用 SendMessage/PostMessage,因为那样会在会话 0 隔离下失败。

http://www.microsoft.com/whdc/system/vista/services.mspx

现在,鉴于您的要求,您将陷入困境。对于跨平台问题,我不确定是否支持远程处理。您可能必须下拉并一直回到套接字:http: //msdn.microsoft.com/en-us/library/system.net.sockets.aspx

于 2008-09-17T18:45:56.513 回答
4

如果这是一个托盘应用程序,而不是一个真正的服务,请注意在使用管道或 TCP/IP 时如何设置通信。如果多个用户登录到一台机器(Citrix、远程桌面),并且每个用户启动一个托盘应用程序“服务”,那么您可能会遇到多个进程试图使用同一个众所周知的端口或管道的情况。当然,如果您不打算支持多个管道,或者如果您拥有真正的服务而不是在每个用户 shell 中运行的托盘应用程序,那么这不是问题。

于 2008-09-17T18:56:47.317 回答
3

让您的服务使用普通的旧 TCP 流套接字在预定义端口上侦听 127.0.0.1。从您的桌面应用程序连接到该端口。

它非常简单,而且完全跨平台。

于 2008-09-17T16:53:06.083 回答
3

你们中有人真的尝试过使用 Mono 进行远程处理吗?它工作得很好。您可能会遇到一些极端情况,但这不太可能。只需不时测试您的应用程序的跨平台(MS.Net <-> Mono)远程处理,以捕捉任何可能的故障。从最近的 Mono 开始,2.4.2 是最新的。

于 2009-06-26T08:26:11.063 回答
2

远程处理是一种选择,但它不是跨平台的。其他一些方法是使用命名管道、IPC 或内核事件。

于 2008-09-17T16:08:41.743 回答
2

有趣的是,我打算建议远程处理!Mono 1.0 发行说明(来自 archive.org ,因为缺少原始位置)提到 System.Runtime.Remoting.dll 作为受支持的库,并且没有说明任何已知问题。

如果远程处理不可用,那么您可能必须实现自己的 TCP 消息帧协议。Windows 没有等效的 UNIX 域套接字用于在同一台机器上进行通信。

于 2008-09-17T16:15:06.300 回答
2

大多数具有 GUI 组件的服务都以指定用户身份运行,并允许访问桌面。这使您可以通过 COM 或 .NET 访问它,但只能在本地访问(除非您想变得复杂)

就个人而言,我在服务上打开了一个普通的旧套接字 - 它的跨平台,允许多个客户端,允许任何应用程序访问它,不依赖 Windows 安全性为其打开,并允许您的 GUI 以任何你喜欢的语言(因为一切都支持套接字)。

对于托盘应用程序,您需要一个简单的协议进行通信 - 您不妨使用 REST 样式系统向其发送命令,并将 XML (yuk) 或自定义数据格式流式传输回来。

于 2008-09-17T16:16:21.850 回答