using System;
using System.ComponentModel;
using System.ServiceProcess;
namespace YLPublishTool.Actions
{
///
/// 停止服务
///
[Description("停止服务")]
class StopServiceAction : IPublishAction
{
public StopServiceAction()
{
SleepSeconds = 10;
}
public string ServiceName { get; set; }
///
/// 等待时间(秒)
///
public int SleepSeconds { get; set; }
public void Execute(IPublishContext context)
{
if (string.IsNullOrWhiteSpace(ServiceName))
{
throw new Exception("服务名称不能为空");
}
try
{
using (var sc = new ServiceController { ServiceName = ServiceName })
{
if (sc.Status != ServiceControllerStatus.Stopped)
{
sc.Stop();
context.SetProperty("[服务]" + ServiceName, "1");
context.LogDebug($"停止服务:{ServiceName},等待时间:{SleepSeconds}s");
System.Threading.Thread.Sleep(SleepSeconds * 1000);
}
else
{
context.LogDebug("服务不需要停止,已处于停止状态,服务:" + ServiceName);
}
}
}
catch (Exception ex)
{
context.LogError("停止服务失败", ex);
}
}
public void SetProperty(string name, string value)
{
if (name == "服务名称")
{
ServiceName = value;
}
else if (name == "等待时间" && !string.IsNullOrEmpty(value))
{
int.TryParse(value.Trim().TrimEnd('s'), out int seconds);
if (seconds < 3) seconds = 3;
SleepSeconds = seconds;
}
}
}
///
/// 启动服务
///
[Description("启动服务")]
class StartServiceAction : IPublishAction
{
public string ServiceName { get; set; }
public bool CheckStart { get; set; }
public void Execute(IPublishContext context)
{
if (string.IsNullOrWhiteSpace(ServiceName))
{
throw new Exception("服务名称不能为空");
}
if (CheckStart && context.GetProperty("[服务]" + ServiceName) == "1")
{
try
{
using (var sc = new ServiceController { ServiceName = ServiceName })
{
if (sc.Status == ServiceControllerStatus.Stopped)
{
sc.Start();
context.LogDebug("启动服务:" + ServiceName);
}
else
{
context.LogDebug("启动服务失败,服务不处于停止状态,服务:" + ServiceName);
}
}
}
catch (Exception ex)
{
context.LogError("启动服务失败", ex);
}
}
else
{
context.LogInfo("根据启动条件,不需要启动此服务:" + ServiceName);
}
}
public void SetProperty(string name, string value)
{
if (name == "服务名称")
{
ServiceName = value;
}
else if (name == "启动条件" && value == "此服务被当前进程停止")
{
CheckStart = true;
}
}
}
}