从零开始学习 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).

image

每层中间件接到请求后都可以直接返回或者调用下一个中间件. 一个比较好的例子就是: 在第一层调用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来返回数据/资源等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章