【发布时间】:2019-09-24 18:50:40
【问题描述】:
我有一个 dotnet 核心控制台应用程序构建来连接到 Sql Service Broker 实例以监控表更改。
该应用监控一个从 ERP 系统更新的表,然后将消息发布到我们的总线。
作为控制台应用程序运行或在我的 IDE 中调试时运行良好。
我在使用 TopShelf 将其配置为 Windows 服务时遇到问题。
这里是入口点:
private static void Main(string[] args)
{
RegisterComponents();
var serviceHost = HostFactory.Run(sc =>
{
sc.Service<ISalesOrderMonitorService>(s =>
{
var sqlListener = _container.ResolveNamed<SqlDependencyEx>(ListenerKey.SalesOrder);
var changeHandler = _container.Resolve<ISalesOrderChangeHandler>();
var listenerConfig = _container.ResolveNamed<ListenerConfiguration>(ListenerKey.SalesOrder);
var logger = _container.Resolve<ILogger<SalesOrder>>();
s.ConstructUsing(f =>
new SalesOrderMonitorService(sqlListener, changeHandler, listenerConfig, logger));
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
});
});
var exitCode = (int) Convert.ChangeType(serviceHost, serviceHost.GetType());
Environment.ExitCode = exitCode;
}
“工人”阶级:
public abstract class ServiceBase<T, TZ> : IService<T>
where T : IChangeHandler
{
protected readonly IChangeHandler ChangeHandler;
protected readonly SqlDependencyEx Listener;
protected readonly ListenerConfiguration ListenerConfiguration;
protected readonly ILogger<TZ> Logger;
protected ServiceBase(SqlDependencyEx listener, IChangeHandler changeHandler,
ListenerConfiguration listenerConfiguration, ILogger<TZ> logger)
{
Logger = logger;
ListenerConfiguration = listenerConfiguration;
Listener = listener;
ChangeHandler = changeHandler;
}
public virtual void Start()
{
try
{
Listener.TableChanged += (o, e) => ChangeHandler.Process(e);
Listener.Start();
Logger.LogDebug(
$"Listening to changes on the {ListenerConfiguration.Table} table in the {ListenerConfiguration.Database} database");
}
catch (Exception e)
{
Logger.LogError(e, e.Message);
throw;
}
}
public virtual void Stop()
{
Listener.Stop();
}
通过TopShelf安装没问题:
c:>{ServiceName}.exe install -username "serviceAccount" -password "superSecret" -servicename "ServiceName" -servicedescription "Description" -displayname "Service DisplayName" --autostart
当我开始服务时 - 我得到了这个:
这是具有误导性的,因为事件查看器会显示:
这发生的速度快于 30 秒。这肯定与我如何配置 TopShelf 有关。
如前所述 - 应用程序在运行“调试”或仅作为 exe 控制台时运行良好。
【问题讨论】:
-
您可以尝试从代码中显式启动调试器,以便逐步解决问题。尝试将此行
System.Diagnostics.Debugger.Launch()添加到 Main() 方法的开头。有关详细信息,请参阅此答案stackoverflow.com/questions/7276936/start-debugger-in-code/… -
从昨天开始,.NET Core 3.0 的内置支持是你该走的路,devblogs.microsoft.com/aspnet/…