在 Windows 服务中托管 ASP.NET CoreHost Core in a Windows Service

Host ASP.NET Core in a Windows Service

提问人:sea-wave 提问时间:11/8/2023 最后编辑:marc_ssea-wave 更新时间:11/9/2023 访问量:111

问:

我有一个问题来自官方网站:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-7.0&tabs=visual-studio

本文旨在教人们发布作为 Windows 服务运行 ASP.NET Core 项目。

我认为有两部分:一部分是工人服务项目,另一部分是 ASP.NET 核心项目,这篇文章说你应该建立一个工人服务项目。

然后进行应用配置,如以下屏幕截图所示:

截屏

我认为 ASP.NET Core 项目中的图像中包含的代码,我不知道 worker service 项目和 ASP.NET Core 项目之间的关系,所以我不知道如何将 ASP.NET Core 项目发布到 Windows 服务,谁能告诉我一些关于这一点的事情?

ASP.网络核心

评论

0赞 Panagiotis Kanavos 11/8/2023
只有一个项目,而不是两个。Worker 模板仅用于演示如何创建同时执行一些后台工作的 ASP.NET Core 项目。您最终得到的是一个具有托管服务和调用的 ASP.NET Core 应用程序.AddWindowsService()
0赞 Jason Pan 11/8/2023
希望我的以下示例可以为您更清楚地解释它,它仍然有一些问题,例如.但这不是在这种情况下的主要问题,如果您愿意,我稍后会更新。InvalidOperationException: The view 'Privacy' was not found
0赞 Jason Pan 11/9/2023
调查问题后,以下答案将告诉你如何将辅助角色服务 asp.net 核心 Web 应用部署到 Windows 服务。
0赞 Jason Pan 11/9/2023
经过测试,在我看来,这两个项目之间没有区别,即工作器服务添加了 Microsoft.Extensions.Hosting.WindowsServices 包并删除了 mvc 相关的内容。这两个项目是可以互换的,本质上是相同的。

答:

1赞 Jason Pan 11/8/2023 #1

1.简单的方法:创建一个 Asp.net 核心MVC项目

1.添加软件包Microsoft.Extensions.Hosting.WindowsServices

2.添加程序.csbuilder.Services.AddWindowsService();

3.将其部署为单个文件并将其注册为 Windows 服务,如下所示,您可以在第 2 节中找到详细步骤。

enter image description here

技巧

如果我们将其部署为 Windows 服务,它将在 kestrel 上运行,最好在代码中定义端口。

        builder.WebHost.ConfigureKestrel(serverOptions =>
        {
            serverOptions.ListenAnyIP(5000); // http
        });

2. 创建 Worker Server 项目

Panagiotis Kanavos的评论是正确的。辅助角色服务项目是 Windows 服务中使用的简化项目模板。

你可以按照我的步骤让 worker 服务支持 mvc 等功能。

enter image description here

enter image description here

1.创建文件夹和文件,如mvc项目

2.添加 .Microsoft.AspNetCore.App

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-WorkerService1-d5189c80-2268-4d3c-9c71-bf06594ee612</UserSecretsId>
    <RazorCompileOnPublish>true</RazorCompileOnPublish>
    <RazorCompileOnBuild>true</RazorCompileOnBuild>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.1" />
  </ItemGroup>
  <ItemGroup>
      <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Views\Home\" />
    <Folder Include="Views\Shared\" />
  </ItemGroup>
</Project>

3.程序.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using System.Diagnostics;

namespace WorkerService1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            builder.WebHost.ConfigureKestrel(serverOptions =>
            {
                serverOptions.ListenAnyIP(5000); // http
            });

            builder.Services.AddControllersWithViews();
            builder.Services.AddWindowsService();
            builder.Services.AddHostedService<Worker>();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (!app.Environment.IsDevelopment())
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.MapControllerRoute(
               name: "default",
               pattern: "{controller=Home}/{action=Index}/{id?}");

            app.Run();

            //IHost host = Host.CreateDefaultBuilder(args)
            //    .ConfigureServices(services =>
            //    {
            //        services.AddHostedService<Worker>();

            //    })
            //    .Build();
            //host.Run();
        }
    }
}

===更新===

4.将项目SDK更改为Web,然后我们会发现项目图标将更改,我们需要重新加载项目。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-WorkerService1-d5189c80-2268-4d3c-9c71-bf06594ee612</UserSecretsId>
    <RazorCompileOnPublish>true</RazorCompileOnPublish>
    <RazorCompileOnBuild>true</RazorCompileOnBuild>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.1" />
  </ItemGroup>
  <ItemGroup>
      <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="wwwroot\" />
    <Folder Include="Views\Home\" />
    <Folder Include="Views\Shared\" />
  </ItemGroup>
</Project>

enter image description here

4.然后我们需要将应用程序发布为单个文件

enter image description here

5.创建 Windows 服务并手动启动它

enter image description here

enter image description here

6.检查端口 5000。

enter image description here

评论

1赞 Maytham Fahmi 11/9/2023
很棒的东西。👍