我们有一个托管某些WCF服务的现有Windows服务。这些是我们的一些集成API。
我们要做的是在此Windows服务中启动Asp.Net Core应用程序。此Asp.Net Core应用程序位于单独的项目中,我们希望将其保留在该项目中。该项目将被编译为ClassLibrary。
当您键入“作为Windows服务的Asp.Net Core”时,这不会像在google上找到的常见文章那样完成。
我找到了这个question,但是答案不合适。我们希望避免将其注册为单独的服务,因为在安装过程中需要进行额外的工作。
我还认为,如果我构建IWebHost并调用在单独的线程上运行,它将起作用。确实,Web服务器已启动,但我对其提出的所有请求均无效,因为根本没有任何反应。
有人遇到过这种问题吗?
答案 0 :(得分:1)
类库项目文件(目标为netstandard2.0)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
</ItemGroup>
</Project>
Service Program.cs(目标为net472)
class Program
{
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup(typeof(Startup).Assembly.FullName);
public static void Main(string[] args)
{
Task.Run(() => CreateWebHostBuilder(args).Build().Run());
var rc = HostFactory.Run(x => //1
{
x.Service<TownCrier>(s => //2
{
s.ConstructUsing(name=> new TownCrier()); //3
s.WhenStarted(tc => tc.Start()); //4
s.WhenStopped(tc => tc.Stop()); //5
});
x.RunAsLocalSystem(); //6
x.SetDescription("Sample Topshelf Host"); //7
x.SetDisplayName("Stuff"); //8
x.SetServiceName("Stuff"); //9
}); //10
var exitCode = (int) Convert.ChangeType(rc, rc.GetTypeCode()); //11
Environment.ExitCode = exitCode;
}
}
public class TownCrier
{
readonly Timer _timer;
public TownCrier()
{
_timer = new Timer(1000) {AutoReset = true};
_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now);
}
public void Start() { _timer.Start(); }
public void Stop() { _timer.Stop(); }
}
该服务需要添加几个nuget包: