我正在尝试制作一个 Windows 服务,它只是坐下来侦听命名管道上的消息。但它不起作用。尝试连接到命名管道只是超时,当我在 Process Explorer 中查看服务进程的进程句柄时,我看不到命名管道。
这是我到目前为止所拥有的:
namespace Service
{
class Service : ServiceBase
{
Thread workerThread;
static bool serviceStarted = false;
static PipeSecurity pipeSecurity = new PipeSecurity();
public Service()
{
this.ServiceName = "Service";
this.EventLog.Log = "Application";
this.EventLog.Source = "ServiceName";
this.CanHandlePowerEvent = false;
this.CanHandleSessionChangeEvent = false;
this.CanPauseAndContinue = false;
this.CanShutdown = true;
this.CanStop = true;
}
static void Main()
{
ServiceBase.Run(new Service());
}
protected override void OnStart(string[] args)
{
base.OnStart(args);
pipeSecurity.AddAccessRule(new PipeAccessRule("Authenticated Users", PipeAccessRights.ReadWrite, AccessControlType.Allow));
pipeSecurity.AddAccessRule(new PipeAccessRule(WindowsIdentity.GetCurrent().User, PipeAccessRights.FullControl, AccessControlType.Allow));
ThreadStart threadStart = new ThreadStart(WorkerThread);
workerThread = new Thread(threadStart);
workerThread.Start();
serviceStarted = true;
}
protected override void OnStop()
{
base.OnStop();
serviceStarted = false;
workerThread.Join(new TimeSpan(0, 0, 30));
}
protected override void OnShutdown()
{
base.OnShutdown();
serviceStarted = false;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
private void WorkerThread()
{
while (serviceStarted)
{
try
{
using (NamedPipeServerStream pipeServerStream = new NamedPipeServerStream("PipeName", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.None, 128, 128, pipeSecurity))
{
pipeServerStream.WaitForConnection();
byte[] buffer = new byte[128];
StringBuilder message = new StringBuilder();
do
{
int len = pipeServerStream.Read(buffer, 0, buffer.Length);
message.Append(Encoding.UTF8.GetString(buffer, 0, len));
}
while (!pipeServerStream.IsMessageComplete);
EventLog.WriteEntry(message.ToString());
}
}
catch(Exception ex)
{
}
finally
{
if (serviceStarted)
Thread.Sleep(100);
}
}
Thread.CurrentThread.Abort();
}
}
}
似乎命名管道没有被创建。有任何想法吗?当我尝试通过 Powershell 连接时:
PS C:\> $Client = New-Object System.IO.Pipes.NamedPipeClientStream(".", "PipeName", [System.IO.Pipes.PipeDirection]::Out)
PS C:\> $Client.Connect(1000)
Exception calling "Connect" with "1" argument(s): "The operation has timed out."
At line:1 char:1
+ $Client.Connect(1000)