【发布时间】:2018-06-14 00:45:30
【问题描述】:
我正在尝试使用最新的 Dotnet Core 2.1 运行时构建 Windows 服务。我没有托管任何 aspnet,我不希望或不需要它来响应 http 请求。
我也看过这篇文章:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.1
代码在使用 dotnet run 在控制台窗口内运行时效果很好。我需要它作为 Windows 服务运行。我知道有 Microsoft.AspNetCore.Hosting.WindowsServices,但这是针对 WebHost,而不是通用主机。我们会使用 host.RunAsService() 作为服务运行,但我看不到它存在于任何地方。
如何将其配置为作为服务运行?
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace MyNamespace
{
public class Program
{
public static async Task Main(string[] args)
{
try
{
var host = new HostBuilder()
.ConfigureHostConfiguration(configHost =>
{
configHost.SetBasePath(Directory.GetCurrentDirectory());
configHost.AddJsonFile("hostsettings.json", optional: true);
configHost.AddEnvironmentVariables(prefix: "ASPNETCORE_");
configHost.AddCommandLine(args);
})
.ConfigureAppConfiguration((hostContext, configApp) =>
{
configApp.AddJsonFile("appsettings.json", optional: true);
configApp.AddJsonFile(
$"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json",
optional: true);
configApp.AddEnvironmentVariables(prefix: "ASPNETCORE_");
configApp.AddCommandLine(args);
})
.ConfigureServices((hostContext, services) =>
{
services.AddLogging();
services.AddHostedService<TimedHostedService>();
})
.ConfigureLogging((hostContext, configLogging) =>
{
configLogging.AddConsole();
configLogging.AddDebug();
})
.Build();
await host.RunAsync();
}
catch (Exception ex)
{
}
}
}
#region snippet1
internal class TimedHostedService : IHostedService, IDisposable
{
private readonly ILogger _logger;
private Timer _timer;
public TimedHostedService(ILogger<TimedHostedService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Background Service is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation("Timed Background Service is working.");
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Background Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
#endregion
}
编辑:我再说一遍,这不是托管 ASP.NET Core 应用程序。这是一个通用的主机构建器,而不是一个 WebHostBuilder。
【问题讨论】:
-
不是骗子。那是用于托管 asp.net 核心。 WebHost.RunAsService。我没有使用 WebHost,我使用的是通用主机。
-
再次查看主机构建器。它不是用于监听 http 请求的 WebHostBuilder。它是一个通用的 HostBuilder,只为运行后台任务而设计,它不监听 http 请求。必读:docs.microsoft.com/en-us/aspnet/core/fundamentals/host/…
-
你找到解决这个问题的合适方法了吗?