使用已内置ASP.NET Core web服务器的.NET Core控制台应用程序的构建?

3
我在网上看到了各种关于构建 .NET Core 控制台应用程序和构建 ASP.NET Core 应用程序的教程,但是我没有找到有关构建以控制台输出为起点且还包含 ASP.NET Web 应用程序的 .NET Core 控制台应用程序的内容。在这种情况下,我正在编写一个作为 Windows 或 Linux 服务运行的应用程序。它作为守护进程运行。所以现在我想添加一个 ASP.NET Core Web 接口来输出状态信息。
有没有推荐的方法?我认为我需要创建一个 WebHostBuilder 并使用 .Build() 创建我的新 WebHost,但我应该为此创建一个新项目并从我的控制台应用程序项目中引用它吗?如果是这样,该项目应使用哪个 SDK?我不能使用 Microsoft.NET.Sdk.Web,因为它需要一个 Main 方法,显然如果这将被引用自具有其自己的 Main 方法的现有应用程序,则不需要这个方法,但如果我使用 Microsoft.NET.Sdk.Razor,我似乎会遇到一堆依赖性版本冲突和错误,如:

检测到 Microsoft.Extensions.Configuration.Abstractions 的版本冲突。直接在项目 MyProject 中安装/引用 Microsoft.Extensions.Configuration.Abstractions 2.1.1 以解决此问题。

所以我感觉我在这里缺少了一些基础知识;在 .NET Core 中将 Web 应用程序嵌入控制台应用程序中的最佳实践是什么?

你要找的概念是“ASP.NET Core自托管”。如果你在网上搜索这个,你应该会找到很多有用的信息。 - mason
@mason 从根本上讲,这要求我继续使用.Web SDK,而这不是我用于控制台应用程序的SDK。它甚至会导致VS在VS解决方案资源管理器中的项目旁边放置一个“Web应用程序”图标,因此似乎不太合适。 - Jez
2
不确定您的问题是什么,但ASP.NET Core应用程序已经是控制台应用程序。 - Tseng
只需创建一个 Web 应用程序,只要使用 Kestrell 而不是 IIS 运行它,它就是一个控制台项目。 - rekiem87
在Windows服务中托管已经有文档记录了,https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.1 您可以发表评论并要求微软为Linux编写一个。 - Lex Li
嗨@Jez,你解决了这个问题吗? - Konda
1个回答

4
您可以在.NET Core项目中安装ASP.NET Core包,并构建一个 WebHost,它将作为应用程序中的Web服务器组件,正如您自己所说。 一种简单的方法是安装Microsoft.AspNetCore.App元包,其中包括常用于ASP.NET Core应用程序的所有软件包依赖项。
由于ASP.NET Core技术超出了我的回答范围,从现在开始我会使用简短的例子。
在您的项目中安装Microsoft.AspNetCore.App元包后,您可以继续创建一个Startup类来初始化服务器,并使用ASP.NET Core技术开发应用程序。以下是一个简单的Startup类示例:
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        /* configure any services you need here */
    }

    public void Configure(IApplicationBuilder app)
    {
        // Output a "hello world" to the user who accesses the server
        app.Use(async (context, next) =>
        {
            await context.Response.WriteAsync("Hello, world!");
        });
    }
}

那么您可以创建一个类似以下方式的Web主机:
IWebHost myHost = WebHost.CreateDefaultBuilder()
    .UseStartup<Startup>()
    .Build();

最后,您必须调用Run()方法以便您的Web主机运行并开始监听连接:
myHost.Run();

运行应用程序,服务器将使用一些默认配置运行(可能在http://localhost:5000/地址下…服务器的地址/端口将默认打印到您的控制台输出)。尝试通过浏览器访问服务器,它应该向您输出一个漂亮的“hello world”消息。 Run()方法是一个阻塞方法。由于您已经有了一个想要“扩展”为 Web 主机的控制台应用程序,因此您应该查看Start()方法,它可以启动 Web 主机而不会阻止您的控制台应用程序,并且您可以使用它来执行一些操作,比如获取用户的输入。在这个文档页面中有一个小例子可以帮助您实现这个功能。

1
但是,如果您没有使用 Microsoft.NET.Sdk.Web SDK,那么 Razor 页面能否正确编译并包含在输出中呢? - Jez
使用 <FrameworkReference> - Mr. TA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接