ASP .NET Core 3 框架揭秘

第一章:全新的开发体验

Posted by     "Jordon Li" on Monday, May 25, 2020

TOC

ASP .NET Core 3 框架揭秘 - 全新的开发体验

Windows平台

1. 构建开发环境

  • 安装SDK和IDE, .NET Core SDK 提供一个重要的命令行工具dotnet.exe

  • 查看当前.NET Core SDK的基本信息

    dotnet --info
    

2. 使用命令行创建.NET Core应用

  • 获取脚手架模板列表

    dotnet new --list
    dotnet new [template type name] -n [project/item name]
    
    • Templates: Project Template, Item Template。

    • [project name].csproj

      <Project Sdk="Microsoft.NET.Sdk">
          
        <PropertyGroup>
          <!--编译输出类型-->
          <OutputType>Exe</OutputType>
          <!--目标框架-->
          <TargetFramework>netcoreapp3.1</TargetFramework>
        </PropertyGroup>
              
      </Project>
      
  • 编译项目,bin\Debug\netcoreapp3.0

    dotnet build
    
  • 运行项目

    dotnet run
    

3. ASP .NET Core 应用

一个ASP.NET Core 应用构建在ASP.NET Core框架之上,ASP.NET Core框架利用一个消息处理管道完成对HTTP请求的监听接收处理和最终的响应

ASP.NET Core管道一个服务器(Server)若干个中间件(Middleware)构成,当宿主(Host)程序启动后,管道被构建出来,管道的服务器就开始监听来自客户端的HTTP请求。

  • 添加引用/修改SDK

    <!--添加引用-->
    <Project Sdk="Microsoft.NET.Sdk">
      
      <PropertyGroup>
        <!--编译输出类型-->
        <OutputType>Exe</OutputType>
        <!--目标框架-->
        <TargetFramework>netcoreapp3.1</TargetFramework>
      </PropertyGroup>
      <ItemGroup>
        <FrameworkReference Include="Microsoft.AspNetCore.App" />
      </ItemGroup>
      
    </Project>
    
    <!--修改SDK-->
    <Project Sdk="Microsoft.NET.Sdk.Web">
      
      <PropertyGroup>
        <!--目标框架-->
        <TargetFramework>netcoreapp3.1</TargetFramework>
      </PropertyGroup>
      
    </Project>
    
  • 修改SDK > launchsettings.json

    该文件设置仅在Development环境下使用,Production环境下不需要该文件。

    {
      //IIS
      "iisSettings": {
        "windowsAuthentication": false,
        "anonymousAuthentication": true,
        "iisExpress": {
          "applicationUrl": "http://localhost:51742/",
          "sslPort": 44340
        }
      },
      //
      "profiles": {
        "IIS Express": {
          //IISIISExpressExecutable<.exe>Project
          //Executable > executablePath:
          "commandName": "IISExpress",	
          //
          "launchBrowser": true,
          //
          "environmentVariables": {
            //
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        },
        "HelloWorld": {
          "commandName": "Project",
          "launchBrowser": true,
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          },
          //URl
          "applicationUrl": "https://localhost:5001;http://localhost:5000"
        }
      }
    }
    
  • 注册服务与中间件

    • 服务承载系统:
      • 需长时间运行的操作:IHostedService承载服务
      • 所有承载服务的宿主(Host):IHost对象
      • IHost对象 的构建者(Builder):IHostBuilder对象
    • ASP.NET Core 应用本质:一个用来监听接收处理HTTP请求的后台服务(GenericWebHostService : IHostedService)。
    • 运行的ASP.NET Core 应用本质体现:由一个服务器(Server)若干个中间件(Middleware)构成的消息处理管道(由GenericWebHostService服务构建)。
      • 服务器(Server):解决针对HTTP请求的监听、接收和最终响应。
      • 中间件(Middleware):针对请求的处理。
    • ASP.NET Core提供的常用原生服务类型:
      • KestrelServer:跨平台的Web服务器,可以作为独立的Web服务器直接对外提供服务,也可以结合传统的Web服务器(IIS、Apache、Nginx…)将它们作为反向代理使用。
      • HTTP.sys:只能在Windows平台上使用的Web服务器,本质是在一个操作系统内核模式运行的驱动,所以能够提供非常好的性能。
    class Program
    {
        static void Main(string[] args)
        {
            //1. 创建IHostBuilder对象
            Host.CreateDefaultBuilder() 
                  
                //2. 用ConfigureWebHost构建请求处理管道
                .ConfigureWebHost(webHostBuilder => webHostBuilder
                    //2.1. 将KestrelServer注册为服务器
                    .UseKestrel()   
                    //显式指定URL
                    //.UseUrls("http://0.0.0.0:3721;https://0.0.0.0:9527")
                    //2.2. 注册中间件
                    .Configure(app => app.Run(
                        context => context.Response.WriteAsync("Hello World"))))
                  
                //2. 用ConfigureWebHostDefaults构建请求处理管道
                .ConfigureWebHostDefaults(webHostBuilder => webHostBuilder
                    //2.1. 注册中间件
                    .Configure(app => app.Run(
                        context => context.Response.WriteAsync("Hello World"))))
                  
                //3. 构建宿主IHost对象   
                .Build()
                //4. 启动程序
                .Run();     
        }
    }
    
  • 运行项目

    dotnet run
    

    注册的KestrelServer服务默认会绑定到http://localhost:5000https://localhost:5001的地址监听请求。承载环境(Hosting Environment)Production

4. ASP.NET Core MVC 应用

ASP.NET Core MVC开发框架是建立在用来实现路由的EndpointRoutingMiddleware中间件和EndpointMiddleware中间件构建的路由系统上。这两个中间件采用终结点(Endpoint)映射的方式实现针对HTTP请求的路由。

MVC应用路由映射体现:HTTP请求与目Controller类型中标Action的映射。

ASP.NET Core MVC利用路由系统为它分发请求,并在此基础上实现针对目标Controller的激活、Action方法的选择和执行,以及最终对于执行结果的响应。

  • 注册服务与中间件

    ASP.NET Core框架内置了一个原生的依赖注入框架,该框架利用依赖注入容器提供管道在构建以及请求处理过程中所需的服务,这些服务需要在应用启动时被预先注册。

    class Program
    {
        static void Main(string[] args)
        {
            //1. 创建IHostBuilder对象
            Host.CreateDefaultBuilder() 
                //2. 构建请求处理管道
                .ConfigureWebHostDefaults(webHostBuilder => webHostBuilder
                    //2.1. 依赖服务注册
                    .ConfigureServices(services => services
                        .AddRouting()
                        .AddControllersWithViews())
                    //2.2. 注册中间件
                    .Configure(app => app
                        //注册EndpointRoutingMiddleware中间件
                        .UseRouting()
                        //注册EndpointMiddleware中间件
                        .UseEndpoints(endpoints => endpoints
                            //完成定义在Controller类型中所有Action方法的映射
                            .MapControllers())))
                //3. 构建宿主IHost对象   
                .Build()
                //4. 启动程序
                .Run();     
        }
    }
    
  • 引入视图(View)

    //继承Controller类型,使HelloController具有视图呈现能力
    public class HelloController : Controller   
    {
        [HttpGet("/hello/{name}")]
        //IActionResult:Action方法执行的结果
        public IActionResult SayHello(string name)
        {
            //将值传递给呈现的视图
            ViewBag.Name = name;
            //返回当前Action方法对用的ViewResult对象
            //未显式指定视图名,视图引擎会将当前Action的名称作为视图名
            return View();
        }
    }
    

    视图引擎定位视图文件(读取对应.cshtml)的规则:{ContentRoot}\Views\{ControllerName}\{ViewName}.cshtml

    {ContentRoot}\Views\Hello\SayHello.cshtml

    <html>
    <head>
        <title>Hello World</title>
    </head>
    <body>
        <p>Hello, @ViewBag.Name</p>
    </body>
    </html>
    
  • 注册Startup类型

    开发中,一般将中间件以及依赖的服务注册定义到一个单独的类中。按照约定,通常命名为Startup。约定优于配置。

    //不需要实现/继承某个预定义接口/类型,采用基于约定的定义方式
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services) => services
            .AddRouting()
            .AddControllersWithViews();
      
        public void Configure(IApplicationBuilder app) => app
            .UseRouting()
            .UseEndpoints(endpoints => endpoints.MapControllers());
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            //1. 创建IHostBuilder对象
            Host.CreateDefaultBuilder() 
                //2. 构建请求处理管道
                .ConfigureWebHostDefaults(
                    webHostBuilder => webHostBuilder.UseStartup<Startup>())
                //3. 构建宿主IHost对象   
                .Build()
                //4. 启动程序
                .Run();     
        }
    }
    

macOS

1. 构建开发环境

  • 安装SDK和IDE, .NET Core SDK 提供一个重要的命令行工具dotnet.exe

  • 查看当前.NET Core SDK的基本信息

    dotnet --info
    

2. 使用命令行创建.NET Core应用

Linux

支持.NET Core 的Linux Distribution: RHEl、Ubuntu、Debian、Fedora、CentOS、SUSE

1. 启用Linux子系统

  • 开启Windows 10 > Linux子系统(Windows Subsystem for Linux, WSL)。只需开启Virtual Machine PlatformWindows Subsystem for Linux两个特性。

    Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • 从Microsoft Store下载安装对应的Linux Distribution

  • 查看安装的Linux Distribution的版本信息

    //进入`Linux Bash Shell`
    bash
    lsb_release -a
    //回复CMD命令行模式
    exit
    

2. 构建开发环境

  • 注册Microsoft密钥和源

    //在安装.NET之前,您需要注册Microsoft密钥,注册产品存储库并安装所需的依赖项。每台机器只需执行一次。
    ~$ wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    ~$ sudo dpkg -i packages-microsoft-prod.deb
    
  • 安装.NET SDK,更新可用于安装的产品,然后安装.NET SDK

    sudo apt-get update
    sudo apt-get install apt-transport-https
    sudo apt-get install dotnet-sdk-3.0
    
  • 如果第二步收到类似于的错误消息Unable to locate package dotnet-sdk-3.0,请运行以下命令

    sudo dpkg --purge packages-microsoft-prod && sudo dpkg -i packages-microsoft-prod.deb
    sudo apt-get update
    sudo apt-get install dotnet-sdk-3.0
    
  • 查看当前.NET Core SDK的基本信息

    dotnet --info
    

Docker

  • 创建Dockerfile文件

  • Restore NuGet packages

    dotnet restore
    
  • 生成镜像

    docker build -t [image name]
    
  • 针对镜像生成并启动容器

    docker run -d -p [hosting machine port]:[internal listening port] --name [container name] [image name]
    

「下次一定」

下次一定

使用微信扫描二维码完成支付