如何在现有Windows服务或控制台应用程序中启动Asp.Net Core应用程序

时间:2018-11-27 15:07:33

标签: asp.net-core windows-services

我们有一个托管某些WCF服务的现有Windows服务。这些是我们的一些集成API。

我们要做的是在此Windows服务中启动Asp.Net Core应用程序。此Asp.Net Core应用程序位于单独的项目中,我们希望将其保留在该项目中。该项目将被编译为ClassLibrary。

当您键入“作为Windows服务的Asp.Net Core”时,这不会像在google上找到的常见文章那样完成。

我找到了这个question,但是答案不合适。我们希望避免将其注册为单独的服务,因为在安装过程中需要进行额外的工作。

我还认为,如果我构建IWebHost并调用在单独的线程上运行,它将起作用。确实,Web服务器已启动,但我对其提出的所有请求均无效,因为根本没有任何反应。

有人遇到过这种问题吗?

1 个答案:

答案 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包:

  • Microsoft.AspNetCore
  • Microsoft.AspNetCore.Hosting.Abstractions
  • Microsoft.AspNetCore.HostFiltering
  • Microsoft.AspNetCore.Server.IIS
  • Microsoft.AspNetCore.Server.IISIntegration
  • Microsoft.AspNetCore.Server.Kestrel
  • Microsoft.AspNetCore.Server.Kestrel.Core
  • Microsoft.Extensions.Configuration.CommandLine
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.Configuration.UserSecrets
  • Microsoft.Extensions.Logging.Configuration
  • Microsoft.Extensions.Logging.Console
  • Microsoft.Extensions.Logging.Debug
  • Microsoft.Extensions.Logging.EventSource

enter image description here