将字符串命令或字节发送到Windows服务?(跑步时)

Ver*_*cas 4 c# windows-services

有没有办法给Windows服务提供字符串或字节数组命令?(跑步时)

Dr.*_*ice 7

我有时会在Windows服务中托管WCF服务,以便在运行时控制服务的行为.

如果您真的只是想将原始数据发送到服务而您不想处理配置WCF服务(顺便说一下,这并不困难),您可以使用命名管道或通过侦听某个端口上的套接字连接.


csh*_*net 7

您需要某种形式的IPC(进程间通信).您选择哪一个可以在很大程度上取决于您想要允许的内容以及您不希望允许的内容.例如,您需要考虑以下事项:

  1. 是否有任何计算机能够将此请求发送到服务或本地计算机?
  2. 是否有任何用户能够发送此请求,或仅发送特定用户/角色?
  3. 如果其他用户看到邮件内容,这是否可能违反安全规定?
  4. 服务是否需要确认消息或发送响应?
  5. 消息是否需要防篡改?
  6. 一次有多少进程/线程在服务上发送消息?

如您所见,在引入IPC时,您会遇到许多问题.考虑上述问题并研究以下可能的解决方案:

  1. .Net Remoting - 简单,但具有安全性和可靠性问题.
  2. WCF服务 - (.Net 3或更高版本)易于编码,在重负载下不够完整.
  3. 套接字 - 难以编码,难以正确,但可以使其工作.
  4. DCOM - 在.Net过程中托管COM对象,并允许Windows封送呼叫.
  5. Win32 RPC - 原始Win32库存在于C#中,或者您可以编写自己的库.

所有这些都有起伏,利弊.这取决于您的具体需求.

由于您指示尝试从本地计算机调用服务,因此最简单的方法是使用WCF over Named Pipes(尝试限制与本地计算机的通信).如果您只想将二进制数据传入和传出服务,那么上面链接的RPC库可以正常工作.

以下示例演示如何使用上面的RPC库:

把它放在你的服务中:

Guid iid = new Guid("{....}");
using (RpcServerApi server = new RpcServerApi(iid))
{
    server.OnExecute += 
    delegate(IRpcClientInfo client, byte[] arg)
    {
        byte[] response;
        //do whatever
        return response;
    };

    server.AddProtocol(RpcProtseq.ncalrpc, "MyServiceName", 5);
    server.AddAuthentication(RpcAuthentication.RPC_C_AUTHN_WINNT);
    server.StartListening();
    ...
Run Code Online (Sandbox Code Playgroud)

这是客户端代码:

Guid iid = new Guid("{....}");
using (RpcClientApi client = new RpcClientApi(iid, RpcProtseq.ncalrpc, null, "MyServiceName"))
{
    client.AuthenticateAs(null, RpcClientApi.Self, RpcProtectionLevel.RPC_C_PROTECT_LEVEL_PKT_PRIVACY, RpcAuthentication.RPC_C_AUTHN_WINNT);
    byte[] input, output;
    output = client.Execute(input);
}
Run Code Online (Sandbox Code Playgroud)