gpt4 book ai didi

wcf - 通过命名管道从 Windows 服务( session #0)连接到桌面应用程序( session #1)

转载 作者:行者123 更新时间:2023-12-03 16:54:32 36 4
gpt4 key购买 nike

给定 :
- 应用程序 - 桌面 GUI (WPF) .NET 应用程序
- Windows 服务监视应用程序(.NET 也是)

Windows 服务定期“ping”应用程序以确保它是健康的(如果不是,winservice 将重新启动它)。
我打算通过命名管道实现“pinging”。为了让事情更简单,我决定用 WCF 来做。该应用程序托管 WCF 服务(一个操作 Ping 返回某些内容)。 Windows 服务是此 WCF 服务的客户端,基于计时器定期调用它。

这就是 Windows 7 中的全部内容。
Windows 服务在 LocalService 下运行(在 session#0 中)。
桌面应用程序正在当前登录的用户下运行(在 session #1 中)。

问题 :
Windows 服务看不到在桌面应用程序中创建和监听的 WCF 端点(使用 NetNamedPipeBinding)。这意味着通过 wcf 代理进行调用时,我会收到此异常:“在您的本地计算机上找不到管道端点 'net.pipe://localhost/HeartBeat'”

我确定代码没问题,因为另一个桌面应用程序(在 session #1 中)可以看到端点。

显然,在这里我正在处理一些用于 Win32 系统对象隔离的安全问题。
但我相信应该有一种方法可以解决我遇到的限制。
我可以牺牲 WCF 方法并采用原始的 NamedPipe 方式。

最佳答案

一个更简单的解决方案可能是将 WCF 双工契约(Contract)与托管 WCF 服务的 Windows 服务一起使用。客户端应用程序在启动时会调用服务上的操作来注册自己。然后,Ping 将是服务在客户端回调合约上定期调用的操作,应用程序将对其进行响应。

服务可见性以这种方式工作,因为 Windows 服务可以使用 SeCreateGlobalPrivilege 运行,因此服务发布管道名称的共享内存对象可以在全局内核命名空间中创建,对其他 session 可见。交互式应用程序在 Windows7 中无法轻松获得该权限,因此此类应用程序中的 WCF 服务回退到在本地内核命名空间中发布管道,仅在它们自己的 session 中可见。

关于wcf - 通过命名管道从 Windows 服务( session #0)连接到桌面应用程序( session #1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4303154/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com