简介和环境搭建
ASP.NET Core是微软开发的一个开源跨平台Web应用程序框架,它提供了高性能、模块化、跨平台的Web开发体验。ASP.NET Core(基于.NET Core)是ASP.NET(基于.NET Framework)的新一代版本,它们之间并不是直接的升级关系,虽然部分概念和功能用法类似,但迁移时可能需要较多调整。本系列笔记以最新的.NET 6为例,介绍ASP.NET Core WebAPI框架的用法,有关MVC、SignalR等内容将在其它章节介绍。
ASP.NET Core的特点
ASP.NET Core具有如下优点:
- 跨平台:ASP.NET Core很容易部署到不同的操作系统(Windows、Linux、macOS)和不同的CPU架构(x86、ARM)中。
- 不依赖IIS:ASP.NET Core内置了Kestrel模块作为Web服务器,因此不再依赖于IIS。
- 高性能:使用ASP.NET Core很容易开发高性能和高吞吐量的应用程序,ASP.NET Core原生支持异步处理。
- 开放源代码:ASP.NET Core是开源的,托管在Github上,任何人都可以查看源代码、提出问题和提交贡献。
- 支持多种应用类型:ASP.NET Core支持构建各种类型的Web应用程序,包括WebAPI纯接口服务端程序、MVC工程、SignalR实时应用程序等。
- 轻量级和模块化:ASP.NET Core使用模块化设计,开发人员可以按需引入需要的模块,这有助于减少应用程序体积并提高灵活性。
- 集成安全功能:ASP.NET Core内置了一套安全功能,包括身份验证和授权、CSRF防护、XSS防护等。
- 集成依赖注入:ASP.NET Core内置了依赖注入容器,有助于开发的便捷和代码的提升可维护性。
然而,ASP.NET Core也并非没有缺点。这里就不得不提到Java的Spring了,首先ASP.NET Core设计上可能不如Java Spring人性化,它有的功能模块功能过于简陋,需要自己造轮子编写大量代码扩展,有的功能模块又封装过深,改造它太难不用它又可惜,最后成了赖在项目里的“鸡肋”。
此外,微软公司在ASP.NET Core的维护上内心可能仍是商业导向的,使用微软开发的一些模块时你会隐约感觉到微软仍站在公司利益角度考虑问题而非站在开发者的角度,尤其是与Microsoft SQL Server和Azure云服务的紧密集成。再加上.NET社区也远不如Java庞大,在大型项目中,一些功能只有非常Shabby的实现,根本满足不了企业级的高可用和高可靠性的要求。ASP.NET Core中很多问题缺乏一个相对标准的最佳实践,你可能需要先掌握Java Spring才知道在ASP.NET Core该如何做才是对的。Java Spring虽然也是乱糟糟的,但Java的社区太庞大了,典型问题基本都有最佳的解决方案。
还有一个问题就是微软的官方文档质量一般,目录划分比较混乱,非常不适合初学者,需要有经验才能看懂,一些深入的问题还是需要查看源码或是动手验证。至于中文文档翻译质量更是奇差,效果还不如直接将英文文档黏贴进ChatGPT里,不过这对于有经验且熟悉英文的同学来说问题不大。
总而言之,ASP.NET Core是一个现代的高性能Web开发框架,适用于构建各种类型的Web应用,但它也有一定的缺点,可能更适合有经验喜欢折腾和造轮子的开发者使用。
同类技术对比
Java的SpringBoot经常被用来和ASP.NET Core进行对比,不可否认的是依托于Java庞大的生态,Spring(包括SpringBoot、SpringCloud)是当下最流行、功能最强大的Web开发技术栈之一,尤其是分布式系统和涉及微服务领域,相比之下ASP.NET Core占有的份额较小。然而Java的历史比较厚重,曾经很长一段时间Java都被搁置在Java8版本,Spring中也有很多历史遗留问题,这就使得它不像被重新设计的.NET Core体系更新的那么激进,SpringBoot也不如ASP.NET Core设计的轻量和优美。随着服务网格的普及和流行,未来的微服务可能不再关注具体某一个微服务用哪种技术实现,因为服务网格可以真正的做到异构系统也能无缝集成到一起,未来我们可能有机会抛开Spring“全家桶”,体验一些不同的技术。
除了Java以外,Go语言和其生态(包括Gin、Beego等框架)也可以和ASP.NET Core进行对比,Go语言具有语法简单、高性能、静态编译等特点,很多团队都尝试过采用Go语言来开发一部份模块作为Java的替代,然而Go语言的缺点也很明显,Go语言的语法过于简单和偏执,生态也不如Java和.Net成熟,很多人认为这种有点“蹩脚”的语言从开发体验上来说相比Java和C#差距较大。
创建工程
使用dotnet-cli创建工程
首先确认你已经安装了.Net SDK6或更高版本,我们可以执行以下命令查看dotnet
命令已安装的工程模板。
dotnet new list
创建ASP.NET Core WebAPI工程需要使用webapi
模板,我们可以执行以下命令创建工程。
dotnet new webapi -n DemoWebAPI --framework net6.0
其中-n
参数指定工程名,--framework
指定选择的.Net SDK版本。
使用Visual Studio创建工程
在Visual Studio中,我们可以选择「ASP.NET Core Web API」工程模板来创建ASP.Net Core WebAPI工程。
提示:创建工程时,可以取消勾选Configure for HTTPS
。这个功能会启用Kestrel的HTTPS功能,实现在开发阶段提供HTTPS支持,但需要我们同意一个自签名证书。实际生产环境我们都是使用Nginx等对后端服务进行反向代理的,HTTPS配置在Nginx这一层,而应用程序这一层还是以HTTP协议提供服务,在开发阶段开启HTTPS就有点画蛇添足了。HTTPS的配置也可以通过编辑项目内的launchSettings.json
修改。
工程目录结构
假如我们的工程名为DemoWebAPI
,默认创建的WebAPI工程目录结构大致如下。
|_bin # 编译输出目录,不需要手动编辑
|_obj # 编译的中间文件目录,不需要手动编辑
|_Controllers # 控制器代码文件夹
|_WeatherForecastController.cs # 默认创建的一个例子控制器
|_Properties # 用于存放与项目运行和配置相关的文件
|_launchSettings.json # 配置开发环境下的运行和调试行为,不会被发布到生产环境中
|_WeatherForecast.cs # 默认创建的一个例子实体类
|_Program.cs # 工程入口文件,.NET6下该文件默认采用了C#9的顶级语句
|_appsettings.json # 工程配置文件,包含了一些ASP.NET Core默认读取的配置字段,也可以在其中编写自定义配置字段
|_appsettings.Development.json # 分环境的工程配置文件,程序运行后对应环境的配置文件会和appsettings.json合并,环境可以通过环境变量`ASPNETCORE_ENVIRONMENT`指定
|_DemoWebAPI.csproj # 工程描述文件
运行工程
如果使用dotnet-cli
,我们可以执行dotnet run
命令运行程序;如果使用Visual Studio,我们点击运行按钮即可运行工程。
对于WebAPI项目,启动后默认会打开Swagger页面,我们可以在这个页面中测试我们的JSON接口。默认的Swagger页面如下图所示。