从零开始学习 asp.net core 3.1 web api 后端api基础框架(二)-创建项目

目录

一、创建项目

1.选择【文件】→【新建】→【项目】

2.创建【ASP.NET Core Web 应用程序】,点击 下一步

3.项目名称为CoreBackend.Api,点击 创建

4.选【ASP.NET Core 3.1】、【空】 点击 创建

5.打开Program.cs,安装包“Microsoft.Extensions.Hosting.Abstractions”,查找并安装最新版本

二.解读项目

1. 解读项目生成的代码 Program.cs

2. 解读项目生成的代码 Startup.cs

三、注册并使用Controllers

一、创建项目
1.选择【文件】→【新建】→【项目】


2.创建【ASP.NET Core Web 应用程序】,点击 下一步


3.项目名称为CoreBackend.Api,点击 创建


4.选【ASP.NET Core 3.1】、【空】 点击 创建


5.打开Program.cs,安装包“Microsoft.Extensions.Hosting.Abstractions”,查找并安装最新版本

 

二.解读项目
1. 解读项目生成的代码 Program.cs


这个Program是程序的入口, 看起来很眼熟, 是因为Asp.Net Core Application实际就是控制台程序(Console Application).
它是一个调用Asp.Net Core 相关库的Console Application。

Main方法是整个项目的入口方法。这里Main只有一行代码,但是实际上执行了三个函数:
1、IHostBuilder builder= CreateHostBuilder(args);
2、IHost host=builder.Build;
3、host.Run;

1、通过CreateHostBuilder(args)方法产生一个IhostBuilder的实例builder。
2、通过builder.Build方法产生一个Ihost的实例host。
3、通过host.Run方法,开始运行Web项目,这时候就可以响应各种请求了。

创建并配置主机:为了方便阅读,把这个Lamada表达式还原下:

 

 

1、使用预配置默认值初始化HostBuilder类的新实例builder。(读取appsettings.json)

2、webBuilder.UseStartup<Startup>();读取startup类配置信息。

3、通过builder.ConfigureWebHostDefaults(Action <IWebHostBuilder >)方法将IHostBuilder实例转变为一个Web主机性质的webbuilder(IWebHostBuilder)。

 

Asp.Net Core 自带了两种http servers, 一个是WebListener, 它只能用于Windows系统, 另一个是Kestrel, 它是跨平台的。
Kestrel是默认的Web Server, 就是通过UseKestrel()这个方法来启用的。
但是我们开发的时候使用的是IIS Express, 调用UseIISIntegration()这个方法是启用IIS Express, 它作为Kestrel的Reverse Proxy Server(反向代理)来用。
如果在Windows服务器上部署的话, 就应该使用IIS作为Kestrel的反向代理服务器来管理和代理请求。
如果在Linux上的话, 可以使用Apache, Nginx等等的作为Kestrel的Proxy Server。
当然也可以单独使用Kestrel作为Web 服务器, 但是使用IIS作为Reverse Proxy还是由很多有点的: 例如,IIS可以过滤请求, 管理证书, 程序崩溃时自动重启等。

2. 解读项目生成的代码 Startup.cs


其实Startup算是程序真正的切入点。

ConfigureServices方法是用来把services(各种服务, 例如identity, ef, mvc等等包括第三方的, 或者自己写的)加入(register)到container(asp.net core的容器)中去, 并配置这些services. 这个container是用来进行dependency injection的(依赖注入). 所有注入的services(此外还包括一些框架已经注册好的services) 在以后写代码的时候, 都可以将它们注入(inject)进去。例如上面的Configure方法的参数, app, env都是注入进去的services。

Configure方法是asp.net core程序用来具体指定如何处理每个http请求的, 例如我们可以让这个程序知道我使用mvc来处理http请求, 那就调用app.UseMvc()这个方法就行。 但是目前, 所有的http请求都会导致返回"Hello World!".

这几个方法的调用顺序: Main -> ConfigureServices -> Configure

请求管道和中间件(Request Pipeline, Middleware)

请求管道: 那些处理http requests并返回responses的代码就组成了request pipeline(请求管道).
中间件: 我们可以做的就是使用一些程序来配置那些请求管道 request pipeline以便处理requests和responses. 比如处理验证(authentication)的程序, 连MVC本身就是个中间件(middleware).

 

每层中间件接到请求后都可以直接返回或者调用下一个中间件. 一个比较好的例子就是: 在第一层调用authentication验证中间件, 如果验证失败, 那么直接返回一个表示请求未授权的response。

在上面【图 Startup.cs】中,app.UseDeveloperExceptionPage(); 就是一个middleware, 当exception发生的时候, 这段程序就会处理它. 而判断env.isDevelopment() 表示, 这个middleware只会在Development环境下被调用。
可以在项目的属性Debug页看到这个设置: 


需要注意的是这个环境变量Development和VS里面的Debug Build没有任何关系。

在正式环境中, 我们遇到exception的时候, 需要捕获并把它记录(log)下来, 这时候我们应该使用这个middleware: Exception Handler Middleware, 我们可以这样调用它:

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler();
}

UseExceptionHandler是可以传参数的, 但暂时先这样, 我们在app.Run方法里抛一个异常, 然后运行程序, 在Chrome里按F12就会发现有一个(或若干个, 多少次请求, 就有多少个错误)500错误。

三、注册并使用Controllers
services.AddControllers(); //添加对控制器和与 API 相关的功能,但不是视图或页面的支持。
services.AddControllersWithViews(); //添加对控制器、 与 API 相关的功能,和视图,但不是页面的支持。
services.AddRazorPages(); //添加支持 Razor 页面和最小控制器支持。

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); // 注册Controllers到Container
}
由于路由现在包括对不止是 MVC 的支持,已更改了术语进行明确说明他们所做的这些方法。 
MapControllers 添加了对属性路由的控制器支持。
MapAreaControllerRoute 将控制器的传统路由添加区域。
MapControllerRoute 添加控制器的常规路由。

我们这儿添加MapControllers :

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

app.UseRouting();

app.UseAuthorization();

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

跑一下, 试试效果:
Chrome显示了一个错误页, 显示了404 Not Found错误。


这是因为我只添加了Controllers middleware, 但是它啥也没做, 也没有找到任何可用于处理请求的代码, 所以我们要添加Controller来返回数据/资源等等。
————————————————
版权声明:本文为CSDN博主「dbmos」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kingyumao/article/details/81532745

上一篇:Docker Kubernetes--services(微服务)


下一篇:关于asp.net.api搭建服务器与传数据序列化的问题