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 选择自己的平台进行安装。
这里简单说下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();
});
}
后记
终于写完了整个计划的第一篇,算是一个好的开始吧,毕竟心心念念这么久才迈出了第一步,希望以后自己坚持下去记录自己的学习,然后能帮助一两人,共同前行。最后祝贺大家中秋快乐!