前言
因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于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.Kestrel2.IIS3.HTTP.sys4.Nginx5.APache6.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 选择自己的平台进行安装。这里简单说下SDK和RunTime区别:
- SDK包含Runtime,用于开发,
- Runtime用于安装运行。安装完成运行
dotnet --list -sdk
查看安装情况。
新建项目
1.打开 VS2019,新建项目。
2.选择ASP.NET Core API 应用,点击下一步,然后创建项目。
3.此处选择.NET 5.0 取消HTTPS勾选。
项目分析
1.整体分析
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 扩展方法来配置请求委托。 可将一个单独的请求委托并行指定为匿名方法(称为并行中间件),或在可重用的类中对其进行定义。 这些可重用的类和并行匿名方法即为中间件,也叫中间件组件。 请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。 当中间件短路时,它被称为“终端中间件”,因为它阻止中间件进一步处理请求。中间件请求过程每个委托均可在下一个委托前后执行操作。 应尽早在管道中调用异常处理委托,这样它们就能捕获在管道的后期阶段发生的异常。
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();});}
后记
终于写完了整个计划的第一篇,算是一个好的开始吧,毕竟心心念念这么久才迈出了第一步,希望以后自己坚持下去记录自己的学习,然后能帮助一两人,共同前行。最后祝贺大家中秋快乐!