【问题标题】:How to pass a parameter to windows service from client machine如何将参数从客户端机器传递给 Windows 服务
【发布时间】:2013-12-05 04:41:21
【问题描述】:

我想从 Windows 服务写入错误日志。我知道从 Windows 服务调用自定义命令,但它不允许任何参数。我想将我的错误消息传递给服务,customcommand 将写入日志。我该怎么做。我尝试了一些东西

我在我的库类中创建了一个静态字符串变量。 每当发生错误时,我都会调用类似

的函数
ATELib.AteBAC.getErrorMessage = "error message from client";
ServiceController Controller = new ServiceController("ATELogsService");
if (Controller.Status == ServiceControllerStatus.Running)
{
    Controller.ExecuteCommand(128);
}

我服务中的代码是

protected override void OnCustomCommand(int command)
{
    if (command == 128)
    {
        using (System.IO.StreamWriter file = new System.IO.StreamWriter(Application.StartupPath + @"\ATELogCheck.txt", true))
        {
            file.WriteLine(ATELib.AteBAC.getErrorMessage);
            ATELib.AteBAC.getErrorMessage = null;
        }
    }
}

它正在创建错误日志文件(ATELogCheck.txt),但文件中没有错误消息(字符串值),创建了一个空的 txt 文件。它是一个静态变量,即使它是空的。我正在使用 tcp 协议并将服务对象称为

baCls = (ATELib.AteBAC)Activator.GetObject(typeof(ATELib.AteBAC), "tcp://localhost:9090/ATE");

如何将字符串值传递给服务?

【问题讨论】:

  • 在库中创建静态变量不会自动使该变量(及其值)可用于引用该库的各种进程。您的服务和客户端之间的ATELib.AteBAC.getErrorMessage 变量不一样。您需要某种形式的 IPC 来发送此字符串。
  • 我会让你的事情复杂一点。我们在 windows 服务上使用了 ETW 侦听器,然后客户端可以生成 ETW 自定义事件并将它们发送到 windows 服务。 msdn.microsoft.com/en-us/library/ms751538(v=vs.110).aspx

标签: c# windows-services error-logging


【解决方案1】:

因为您的服务与您的应用程序在不同的域中运行。因此,您的应用程序中的ATELib.AteBAC.getErrorMessage 与您的服务中的ATELib.AteBAC.getErrorMessage 不同。

老实说,我认为,如果你必须做这样的事情,你的应用程序设计就会出现问题。该服务确实可以持续不断地做某事。或者,它可以“休眠”并监听 TCP 端口。一旦收到信号,它就可以找到工作并执行。当然,在进入不必要的复杂性之前,首先要研究设计。

【讨论】:

  • 这很好解释为什么它会中断,但不是如何传递 OP 要求的值。
  • 有没有办法将消息传递给windows服务??
  • WCF 使用命名管道绑定。远程处理。您需要在两个不同的实时进程之间进行通信。 .Net 有这样的手段。但老实说,我不明白你为什么需要这个来记录日志。应用程序应该能够自己记录事物。在值得的情况下,您可以有一个由应用程序创建并由服务读取的队列。
  • 服务将继续监听端口并使对象在单例模式中保持活动状态。我想传递错误消息。我不知道 WCF
  • 如果您使用套接字监听,服务将监听端口。根据定义,服务是一个长期运行的过程。独立地,您使用什么对象,单例与否。通常,一旦发生滴答声,人们就会放置计时器并让服务寻找工作。但我是说,例如在你的情况下,你可以使用这个OnCustomCommand(int command) 来接收命令“做某事”。您的服务需要知道如何在单独的线程上查找工作和执行工作单元。否则它可能会收集太多的工作。您的问题不是“什么是 WCF”。你得到了为什么你的东西不工作的答案:o)
猜你喜欢
  • 1970-01-01
  • 2016-06-17
  • 2016-05-18
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多