c# - 使用内置的 ASP.NET Core Web 服务器构建 .NET Core 控制台应用程序?

标签 c# asp.net-core asp.net-core-mvc

我在网上看到各种关于构建 .NET Core 控制台应用程序和构建 ASP.NET Core 应用程序的教程,但我没有找到关于构建 .NET Core 控制台应用程序的内容,该应用程序从控制台输出开始但也包含一个 ASP.NET 网络应用程序。在这种情况下,我正在编写一个作为 Windows 或 Linux 服务运行的应用程序。它作为守护进程运行。所以我现在想添加一个 ASP.NET Core Web 界面来输出状态信息。

有推荐的方法吗?我想我需要创建一个 WebHostBuilder 并使用 .Build() 创建我的新 WebHost,但是我应该为此创建一个新项目并且从我的控制台应用程序项目中引用它?如果是这样,它应该为项目使用哪个SDK?我不能使用 Microsoft.NET.Sdk.Web 因为这需要一个 Main 方法,如果要从现有的应用程序有自己的 Main 方法,但如果我使用 Microsoft.NET.Sdk.Razor,我似乎会遇到一堆依赖版本冲突和错误,例如:

Version conflict detected for Microsoft.Extensions.Configuration.Abstractions. Install/reference Microsoft.Extensions.Configuration.Abstractions 2.1.1 directly to project MyProject to resolve this issue.

所以我觉得我在这里缺少一些基本的东西;在 .NET Core 的控制台应用程序中嵌入 Web 应用程序的最佳实践究竟是什么?

最佳答案

您绝对可以在您的 .NET Core 项目中安装 ASP.NET Core 包,并构建一个 WebHost,它将用作您的应用程序中的 Web 服务器组件,正如您自己所说的。一个简单的方法是安装 Microsoft.AspNetCore.App metapackage ,其中将包括 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!");
        });
    }
}

然后您可以继续使用类似的东西创建一个虚拟主机:

IWebHost myHost = WebHost.CreateDefaultBuilder()
    .UseStartup<Startup>()
    .Build();

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

myHost.Run();

运行应用程序,服务器将以一些默认配置运行(可能在 http://localhost:5000/ 地址下...默认情况下,服务器的地址/端口将打印到您的控制台输出).尝试通过浏览器访问服务器,它应该会向您打印一条漂亮的“hello world”消息。

Run() 方法是一种阻塞方法。由于您已经有一个控制台应用程序,您希望使用 Web 主机“扩展”它,因此您可能应该查看 Start()方法,它会在不阻止您的控制台应用程序的情况下触发网络主机,您可以使用它来仍然能够做一些事情,比如接受用户的输入。在 this doc page 中有一个这样做的小例子.

关于c# - 使用内置的 ASP.NET Core Web 服务器构建 .NET Core 控制台应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53345789/

相关文章:

c# - Dictionary.ContainsValue() 总是返回 true

c# - 如何在 .net core-3.0 中测试 header 属性?

asp.net-core-mvc - 在 ASP.NET MVC Core Web API 和 Entity Framework Core 中使用 TryUpdateModel 更新模型不起作用

testing - 在 ASP.NET 5/MVC 6 上的 AspNet.TestHost.TestServer 上下文中访问单元测试内的 Cookie

c# - 如何让敌人在靠近时转向并向玩家移动? Unity3D

c# - 无法将类型 List<<anonymous type : . .>> 隐式转换为 IEnumerable<Product>

c# - Speechsynthesizer (System.Speech.Synthesis.SpeechSynthesizer) - 在运行时更改音量或速率

asp.net-core - 使用 VS Code 进行.NET Core 调试 - "Only 64-bit processes can be debugged"

c# - 如何在 MultipartFormData 中传递字典?

asp.net-identity - 如何在 MVC 6 API 中使用不记名 token ?