ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

前言

因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入.NET的大环境当中。所以萌生了做一篇关于.NET CORE 学习的学习笔记,借着今天小酌几杯的机会,把这个想法践行一下。

为什么学习 ASP.NET Core程序

数百万开发人员在使用ASP.NET创建Web应用。而ASP.NET Core 是对ASP.NET 的重新设计,在结构上做了更改,产生了更精简、更模块化的框架。
ASP.NET Core 具有如下有点:

  • 生成 Web UI 和 Web API 的统一场景。
  • 针对可测试性进行构建。
  • Razor Pages 可以使基于页面的编码方式更简单高效。
  • Blazor 允许在浏览器中使用 C# 和 JavaScript。 共享全部使用 .NET 编写的服务器端和客户端应用逻辑。
  • 能够在 Windows、macOS 和 Linux 上进行开发和运行。
  • 开放源代码和以社区为中心。
  • 集成新式客户端框架和开发工作流。
  • 支持使用 gRPC 托管远程过程调用 (RPC)。
  • 基于环境的云就绪配置系统。
  • 内置依赖项注入。
  • 轻型的高性能模块化 HTTP 请求管道。
  • 能够托管于以下各项:
    1.Kestrel
    2.IIS
    3.HTTP.sys
    4.Nginx
    5.APache
    6.Docker
  • 并行版本控制
  • 简化新式 Web 开发的工具。

ASP.NET Core 和 ASP.NET 比较

ASP.NET Core ASP.NET
针对 Windows、macOS 或 Linux 进行生成 针对 Windows 进行生成
Razor Pages 是在 ASP.NET Core 2.x 及更高版本中创建 Web UI 时建议使用的方法。 另请参阅 MVC、Web API 和 SignalR。 使用 Web Forms、SignalR、MVC、Web API、WebHook 或网页
每个计算机多个版本 每个计算机一个版
使用 C# 或 F# 通过 Visual Studio、Visual Studio for Mac 或 Visual Studio Code 进行开发 使用 C#、VB 或 F# 通过 Visual Studio 进行开发
比 ASP.NET 性能更高 良好的性能
使用 .NET Core 运行时 使用 .NET Framework 运行时

开发环境

安装.NET Core的开发环境,这里笔者用的是.NET 5.0 和VS 2019。下载地址:https://dotnet.microsoft.com/download 选择自己的平台进行安装。
image
这里简单说下SDK和RunTime区别:

  • SDK包含Runtime,用于开发,
  • Runtime用于安装运行。
    安装完成运行dotnet --list -sdk查看安装情况。
    image

新建项目

1.打开 VS2019,新建项目。
image

2.选择ASP.NET Core API 应用,点击下一步,然后创建项目。
image

3.此处选择.NET 5.0 取消HTTPS勾选。
image

项目分析

1.整体分析

image

2.Startup类

Startup 类配置服务和应用请求管道:

  • 包括 ConfigureServices 方法以配置应用的服务。 服务是一个提供应用功能的可重用组件。 在 ConfigureServices 中注册服务,并通过依赖关系注入 (DI) 或 ApplicationServices 在整个应用中使用服务。
  • 包括 Configure 方法以创建应用的请求处理管道。
public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {

            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyWebAPI", Version = "v1" });
            });
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyWebAPI v1"));
            }

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

在应用启动时,ASP.NET Core 运行时会调用 ConfigureServices 和 Configure。

Startup构造函数注入配置IConfiguration。

ConfigureServices方法是把自己或者第三方的服务注入到容器当中(ASP.NET Core 内部包含一整套自己的依赖注入框架),使其在应用和configure方法中可用,服务通过依赖注入或ApplicationServices 进行解析。

Configure方法用于指定应用响应 HTTP 请求的方式。 可通过将中间件组件添加到 IApplicationBuilder 实例来配置请求管道。

ASP.NET Core 模板默认配置管道:

  • 开发人员异常页
  • 异常处理程序
  • HTTP 严格传输安全性 (HSTS)
  • HTTPS 重定向
  • 静态文件
  • ASP.NET Core MVC 和 Razor Pages

3.依赖关系注入(服务)

ASP.NET Core 有内置的依赖关系注入 (DI) 框架,可在应用中提供配置的服务。 例如,日志记录组件就是一项服务。

4.中间件

中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:

  • 选择是否将请求传递到管道中的下一个组件。
  • 可在管道中的下一个组件前后执行工作
    使用 RunMap 和 Use 扩展方法来配置请求委托。 可将一个单独的请求委托并行指定为匿名方法(称为并行中间件),或在可重用的类中对其进行定义。 这些可重用的类和并行匿名方法即为中间件,也叫中间件组件。 请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。 当中间件短路时,它被称为“终端中间件”,因为它阻止中间件进一步处理请求。
    中间件请求过程
    image
    每个委托均可在下一个委托前后执行操作。 应尽早在管道中调用异常处理委托,这样它们就能捕获在管道的后期阶段发生的异常。

5.服务器

Kestrel服务器是默认跨平台 HTTP 服务器实现。 Kestrel 提供了最佳性能和内存利用率,但它没有 HTTP.sys 中的某些高级功能。

IIS HTTP 服务器是 IIS 的进程内服务器。

Kestrel HTTP.sys
更好的性能和内存利用率。 端口共享
跨平台 内核模式 Windows 身份验证。 Kestrel 仅支持用户模式的身份验证。
灵活性,它是独立于操作系统进行开发和修补的。 通过队列传输的快速代理
编程端口和 TLS 配置 直接文件传输
扩展性,允许 PPv2 等协议和备用传输。 响应缓存

6.路由

路由负责匹配传入的 HTTP 请求,然后将这些请求发送到应用的可执行终结点。所有 ASP.NET Core 模板都包括生成的代码中的路由。 路由在 Startup.Configure 中的中间件管道中进行注册。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    });
}

7.错误处理

app.UseDeveloperExceptionPage置于中间件管道的前面部分,它能够捕获随后中间件中抛出的未经处理的异常(这里用于开发环境检测错误)。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
   if (env.IsDevelopment())
   {
       app.UseDeveloperExceptionPage();
   }
   else
   {
       app.UseExceptionHandler("/Error");
       app.UseHsts();
   }

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

   app.UseRouting();

   app.UseAuthorization();

   app.UseEndpoints(endpoints =>
   {
       endpoints.MapRazorPages();
   });
}

后记

终于写完了整个计划的第一篇,算是一个好的开始吧,毕竟心心念念这么久才迈出了第一步,希望以后自己坚持下去记录自己的学习,然后能帮助一两人,共同前行。最后祝贺大家中秋快乐!

posted @ 2021-09-21 22:34  故人与猫  阅读(646)  评论(0编辑  收藏  举报