【问题标题】:.Net Core Worker Service cannot read service injections.Net Core Worker Service 无法读取服务注入
【发布时间】:2020-01-24 06:41:57
【问题描述】:

我创建了一个工作服务并作为 Windows 服务托管在服务器中,但这 Windows 服务无法读取服务注入。 如果我直接执行exe,那么这很好用。我尝试从本地服务帐户和管理员帐户运行服务 - 找不到任何差异

这就是我的 Program.cs 的样子

public class Program
    {
        public static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
            builder.Build();

            CreateHostBuilder(args).Build().Run();
        }

        private static void ConfigureLog(IConfiguration configuration)
        {
            const string loggerTemplate = @"{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u4}]<{ThreadId}> [{SourceContext:l}] {Message:lj}{NewLine}{Exception}";
            var baseDir = AppDomain.CurrentDomain.BaseDirectory;
            var logfile = Path.Combine(baseDir, "App_Data", "logs", "EmployeePositionsFeed.log");

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
                .Enrich.With(new ThreadIdEnricher())
                .Enrich.FromLogContext()
                .WriteTo.File(logfile, LogEventLevel.Information, loggerTemplate,
                    rollingInterval: RollingInterval.Day, retainedFileCountLimit: 90)
                .CreateLogger();
            Log.Information("App starting");
        }

        public static IConfiguration LoadConfiguration()
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true,
                    reloadOnChange: true);
            return builder.Build();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseWindowsService()
                .ConfigureServices((services) =>
                {
                    IConfiguration configuration = LoadConfiguration();
                    ConfigureLog(configuration);
                    services.AddSingleton(configuration);
                    var winScpSettings = new WinScpSettings();
                    configuration.GetSection("WinScpSettings").Bind(winScpSettings);
                    services.AddSingleton(winScpSettings);
                    services.AddHostedService<Worker>();
                });
    }
public class Worker : BackgroundService
{

    private readonly IConfiguration _configuration;
    private readonly WinScpSettings _winScpSettings;

    public Worker(IConfiguration conf, WinScpSettings wscpSettings)
    {
        _configuration = conf;
        _winScpSettings = wscpSettings;
    }


    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {

            Log.Information("TransferWorkerService heart beat running at: {time}", DateTimeOffset.Now);

            Log.Information("TransferWorkerService starting at: {time}", DateTimeOffset.Now);

            Log.Information(_winScpSettings.HostName); //this will come as blank from windows service
            Log.Information(_winScpSettings.SshHostKeyFingerprint);//this will come as blank from windows service

            await new App(_configuration, _winScpSettings).Run();

            Log.Information("TransferWorkerService ended execution at: {time}", DateTimeOffset.Now);

            await Task.Delay(TimeSpan.FromDays(1), stoppingToken);
        }
    }

【问题讨论】:

    标签: .net-core


    【解决方案1】:

    您的 appsettings.json 文件是可选的。尝试使其成为必需,以查看服务是否在启动时失败。由于它是可选的,因此您不会看到启动异常。

    输入 appsettings.json 文件的绝对路径并确保其存在。选择一个非用户特定但对机器全局的目录(如 %programdata% aka C:\ProgramData)。如果这解决了问题,那么您知道您的问题是应用程序无法找到 appsettings.json 文件。

    【讨论】:

    • 感谢您的建议,我刚刚尝试了这个选项,但它没有任何区别 ConfigureLog(); var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile(@"C:\Services\TransferWorkerService\appsettings.json", optional: false, reloadOnChange: true); builder.Build(); CreateHostBuilder(args).Build().Run();返回;
    【解决方案2】:

    我跟着

    ASP.Net Core 2.1 application cannot find appsettings.json when ran as a Windows service

    并将我的构建器更改为

    var processModule = Process.GetCurrentProcess().MainModule;
                    if (processModule != null)
                    {
                        var pathToExe = processModule.FileName;
                        var pathToContentRoot = Path.GetDirectoryName(pathToExe);
                        Directory.SetCurrentDirectory(pathToContentRoot);
                    }
    
                    var builder = new ConfigurationBuilder()
                        .SetBasePath(Directory.GetCurrentDirectory())
                        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                    builder.Build();
    

    解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 2020-06-17
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多