将创建好的控制台应用改造成一个 ASP.NET Core 应用

2021-01-06 04:28

阅读:765

  1. 添加引用

    修改之前创建好的 HelloWorld 控制台应用项目下的 HelloWorld.csproj 文件如下:

    "Microsoft.NET.Sdk">
      Exenetcoreapp3.1"Microsoft.AspNetCore.App">
  2. 注册服务器中间件:

    2.1. 从应用承载或者寄宿(Hosting)方面来看:

    2.1.1 .NET Core 具有一个以 IHost/IHostBuilder 为核心的服务承载系统:任何需要长时间运行的操作都可以定义成 IHostedService 服务并通过该系统来承载。

    2.1.2. IHost 对象可以视为所有承载服务的宿主(Host),而 IHostBuilder 对象则是它的构建者(Builder)

    2.1.3. 一个 ASP.NET Core 应用本质上就是一个用来监听、接收和处理HTTP请求的后台服务,所以它被定义成一个 GenericWebHostService(实现了IHostedService接口),并将它注册到承载系统中,进而实现了针对 ASP.NET Core 应用的承载。

    2.1.4. 一个运行的 ASP.NET Core 应用本质上体现出为由一个服务器和若干中间件构成的消息处理管道,服务器解决针对HTTP请求的监听、接收和最终的响应,具体针对请求的处理则由它递交给后续的中间件来完成。这个管道是由 GenericWebHostService 服务构建的。

    2.1.5. ASP.NET Core 提供了集中原生的服务类型,比较常用的是 KestrelServer 和 HTTP.sys。

    2.1.5.1. KestrelServer 是采用 libuv 创建的跨平台的 Web服务器,可以在 Windows、MacOS 和 Linux 平台上使用。它不仅可以作为独立的Web服务器直接对外提供服务,还可以结合传统的Web服务器(如 IIS、Apache 和 Nginx)将它们作为反向代理来使用。

    2.1.5.2. HTTP.sys 则是一种只能在 Windows 平台上使用的Web服务器,由于它本质上是一个操作系统内核模式运行的驱动,所以能够提供非常好的性能。

  3. 对项目文件 Helloworld.csproj 做了修改之后,再对 Program.cs 中的 Main方法做如下改动:

    ★★★★★ 请先根据下方代码中注释前标注的数字作为顺序阅读??

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Hosting;
    namespace HelloWorld
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                // 1.调用静态类型 Host 的 CreateDefaultBuilder 方法创建一个 IHostBuilder 对象
                Host.CreateDefaultBuilder()
                    // 4. 在调用 Build 方法构建 IHost 对象之前,可以调用 IHostBuilder 接口的 ConfigureWebHost 扩展方法,并利用指定的 Action 委托对象构建 ASP.NET Core 应用的请求处理管道。
                    .ConfigureWebHost(webHostBuilder => webHostBuilder
                        // 4.1. 调用 IWebHostBuilder 接口的 UseKestrel 扩展方法将 KestrelServer 注册为服务器
                        .UseKestrel()
                        // 4.2. 调用 Configure 扩展方法注册了用来处理请求的中间件
                        // 4.3. Configure 扩展方法的输入参数是一个 Action 对象,所需的中间件注册在 IApplicationBuilder 对象上
                        .Configure(app => app
                            // 4.4. 注册的唯一中间件是通过调用 IApplicationBuilder 接口的 Run 扩展方法注册的,该中间件利用指定的 Func 对象将响应的主题内容设置为 “Hello World.”
                            .Run(context => context.Response.WriteAsync("Hello World."))
                        )
                    )
                    // 2. 并最终调用该对象的 Build 方法构建作为服务宿主的 IHost 对象。
                    .Build()
                    // 3. 当调用 IHost 对象的Run 扩展方法时,ASP.NET Core 应用程序将会被启动。
                    .Run();
            }
        }
    }

    将代码修改为如上之后,可以使用 dotnet run 命令或直接在 VS 中运行结果如下:

    技术图片

    注册的 KestrelServer 会绑定到 http://localhost:5000/ 和 https://localhost:5000/ 这两个地址监听请求。访问两个地址都会得到如下结果:

    技术图片

    返回的内容毫无疑问就是中间件写入的。

  4. 修改 SDK

    每个 .NET Core 应用都针对一种具体的 SDK 类型。之前创建的控制台应用默认采用的 SDK 类型为 “Microsoft.NET.Sdk”,而 ASP.NET Core 应用通常采用另一种名为 “Microsoft.NET.Sdk.Web” 的类型。

    若将 SDK 类型设置为 “Microsoft.NET.Sdk.Web”,就可以将针对 “Microsoft.AspNetCore.App” 的框架引用从项目文件中删除。

    若由于不需要利用生成的 .exe 文件启动 ASP.NET Core 应用,所以将 XML 元素 Exe 从  节点中删除。

    最终的项目文件(Helloworld.csproj)如下:

    "Microsoft.NET.Sdk.Web">
        netcoreapp3.1


评论


亲,登录后才可以留言!