【问题标题】:How to get answer from windows service如何从 Windows 服务获得答案
【发布时间】:2019-10-28 12:43:18
【问题描述】:

我有一个 Windows 服务和一个 NotifyIcon-Applicaiton (Sys-Tray) 应该与该服务通信。应用程序应该发送一个命令并从服务接收一个端口,用于提供进一步通信的套接字。

服务覆盖 OnCustomCommand 方法,但我不知道如何向调用程序发送答案。

    protected override void OnCustomCommand(int command)
    {
        switch (command)
        {
            case 'p':
                // SEND Port number
                break;
            case 's':
                // SEND Service Name
                break;
            case 'n':
                // SEND Notification
                break;
        }

        base.OnCustomCommand(command);
    }

通知图标应用程序

var serviceController = new ServiceController("ATLED Service"); serviceController.ExecuteCommand((int)'p');

【问题讨论】:

  • AFAIK CustomCommand 是“单向”的。如果你的服务需要监听客户端 TCP(?) 连接,通常只选择客户端熟知的一个。
  • 有一个与服务通信的套接字,但应用程序不知道只有服务知道的端口。我认为静态端口不是一个好方法(如果端口被占用会发生什么?)
  • 如果 80 端口被占用,IIS 会做什么?如果您真的想加强这一点,那么您应该将所选端口写入配置文件并让应用程序也检查该文件。或者,使用registry

标签: c# windows-services servicecontroller systray


【解决方案1】:

你可以有不同的方法来做到这一点

  1. 您可以使用 TCP 端口,它正在侦听来自服务器的命令回复
  2. 您可以在应用端使用 signalR 并使用它连接服务和应用
  3. 您还可以使用共享内存,或者可以是当应用程序存在某些内容时由服务创建/写入的文件,或者也可以使用数据库

【讨论】:

  • 有没有办法获取服务的安装路径,这样我可以调整一个相对位置来存放文件?
  • 尝试使用此代码获取路径AppDomain.CurrentDomain.BaseDirectory
猜你喜欢
  • 2021-04-29
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多