ASP.NET Core 简介

项目结构

通过vs创建一个新的ASP.NET Core项目,目录结构如下
image.png

Program

在Program类里面有个Main方法,本质上asp.net core就是一个控制台项目,项目运行的时候执行Main方法。
Main方法的作用就是配置了整个asp.net core的应用,然后就运行
image.png

Startup

整个类也是用来配置的,相对来说这个类的配置比较动态,Program里面的配置相对来说比较死板。
运行时Startup是通过一种约定来调用的,调用两个方法

  1. public void ConfigureServices(IServiceCollection services){}
  2. public void Configure(IApplicationBuilder app, IWebHostEnvironment env){}

这两个方法的调用顺序就是先调用ConfigureServices,再调用Configure

ConfigureServices注册服务

ConfigureServices主要是负责配置依赖注入相关的东西

当我们这个程序应用运行的时候,有一些类型就会在这个容器里面进行注册,这些类型就叫做服务,注册了以后,在项目里面,就可以使用这些注册的实例。注册的时候该可以设置这些被请求服务的生命周期。

生命周期:

Transient:每次被请求都会生成一个新的实例 Scoped:一次web请求产生一个实例,web请求被处理完生命周期就截止了 Singleton:这个服务的实例一旦被创建,以后用这个服务的时候都会只用这一个实例,会一直存活到这个项目停止运行

  1. namespace WebApplication4
  2. {
  3. //定义了一个接口,连个类实现了这个接口
  4. public interface IAnimal
  5. {
  6. }
  7. public class Cat : IAnimal
  8. {
  9. }
  10. public class Dag : IAnimal
  11. {
  12. }
  13. }
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. //我们要使用MVC,现在我们注册一下
  4. services.AddControllersWithViews();
  5. //Singleton生命周期到程序结束,注册一下我们自己写依赖服务。每当有类型请求IAnimal类型的服务,就给他返回一个Cat类型的实例
  6. services.AddSingleton<IAnimal, Cat>();
  7. }
  1. public class HomeController:Controller
  2. {
  3. //如果IAnimal类型在IOC容器里面注册了。使用这个方法时都不用显示传参,自动帮你把你注册的那个服务返回的实例注入进去
  4. public HomeController(IAnimal animal)
  5. {
  6. }
  7. }

Configure配置管道

asp.net core的管道,会指定对这个http请求时如何响应的。

客户端发送请求到服务器的过程 客户端==============================服务器 中间的=======就是管道 客户端的请求从进入管道,在到服务器。服务器的响应进入管道,出来后到客户端。

如果这个管道里面什么都没有,那么这个请求从管道过来再回去,什么都不会发生。

中间件

如果想要项目有点作用的话,就要在管道里面放点东西。而我们把放在管道中间能处理请求的东西叫做中间件。

客户端====[身份验证中间件]====[MVC]====[其他]============服务器

请求进管道后,会根据顺序执行相应的中间件,这些中间件会拿到请求执行各种操作。在管道里面加了类内容,返回才不会是什么都没有的结果。

参数

参数里面实际对应的是两个服务,通过依赖注入的方式注入进来,是系统自动帮我们注册的。

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. //判断是不是开发模式
  4. if (env.IsDevelopment())
  5. {
  6. //如果是开发模式,这就是第一个中间件
  7. //如果发生异常,且没有被处理,就会把跳转到一个异常的页面,这个页面有错误的详细信息
  8. app.UseDeveloperExceptionPage();
  9. }
  10. //这个第二个中间件,如果不是开发模式,这就是第一个中间件
  11. //关于处理路由的中间件
  12. app.UseRouting();
  13. app.UseEndpoints(endpoints =>
  14. {
  15. endpoints.MapGet("/", async context =>
  16. {
  17. await context.Response.WriteAsync("Hello World!");
  18. });
  19. });
  20. }

静态文件

asp.net core项目的静态文件都放在,文件跟目录下的wwwroot文件夹里面,没有这个文件夹就就创建一个
image.png
要使用静态文件,需要先在Configure方法里面使用app.UseStaticFiles();中间件

如果wwwroot里面有一张图片,叫img.png,浏览器访问这个文件,路径是http://localhost:5000/img.png。
当然这是本地访问的路径,在服务上就把localhost:5000改成服务器地址。

  1. //使用默认文件,必须放在静态文件之前
  2. app.UseDefaultFiles();
  3. //使用静态文件
  4. app.UseStaticFiles();

默认文件

大多数Web程序都有一个默认文件,访问url时默认显示的页面。UseDefaultFiles是一个URL重写器,实际上并没有提供文件。它只是将URL重写定位到默认文件,然后还是由静态文件中间件提供。地址栏中显示的URL仍然是根节点的URL,而不是重写的URL。

以下是UseDefaultFiles()中间件默认会去查找的地址信息的顺序。
● Index.htm
● Index.html
● default.htm
● default.html
新增的default.html文件需要放入wwwroot文件夹的根目录中,否则无法运行。

自定义默认文件

如果要使用其他文件,比如将52abp.html指定为默认文件。静态文件全部都要放在wwwroot里面

  1. DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions();
  2. defaultFilesOptions.DefaultFileNames.Clear();
  3. defaultFilesOptions.DefaultFileNames.Add("52abp.html");
  4. //使用默认文件,必须放在静态文件之前
  5. app.UseDefaultFiles(defaultFilesOptions);
  6. //使用静态文件
  7. app.UseStaticFiles();

UseFileServer()

UseFileServer()中间件结合了UseStaticFiles()、UseDefaultFiles()和UseDirectory Browser()中间件的功能。
DirectoryBrowser()中间件支持目录浏览,并允许用户查看指定目录中的文件。
把上面的代码修改成这样,效果一样的。

  1. FileServerOptions defaultFilesOptions = new FileServerOptions();
  2. defaultFilesOptions.DefaultFilesOptions.DefaultFileNames.Clear();
  3. defaultFilesOptions.DefaultFilesOptions.DefaultFileNames.Add("52abp.html");
  4. app.UseFileServer(defaultFilesOptions);

进程内/外托管

右键项目,打开项目文件,就是csproj文件。添加一行代码,设置为进程内托管。如果要设置为进程外托管,就把InProcess换成OutOfProcess

● InProcess的值指定要使用进程内托管模型,即在IIS工作进程(w3wp.exe)中托管ASP.NET Core应用程序。 ● OutOfProcess的值指定要使用进程外托管模型,将Web请求转发到运行Kestrel服务器的后端ASP.NET Core应用程序。

  1. <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2. <PropertyGroup>
  3. <TargetFramework>net5.0</TargetFramework>
  4. <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  5. </PropertyGroup>
  6. </Project>

用vs创建一个 新的ASP.NET Core项目时,默认使用的是进程内托管。可以不写

在VS上面的运行项目这里,可以选择
image.png

获取执行应用程序的进程名称

  1. System.Diagnostics.Process.GetCurrentProcess(). ProcessName

如果选择的是IIS Express获取的名字就是iisexpress,而上图中进程外那个,获取的名字就是当前项目名

Kestrel

ASP.NET Core的默认内部服务器。包含在ASP.NET Core项目里面的。他可以直接作为web服务器,它可以直接处理来自客户端的传入HTTP请求。

这个就是进程外托管,当我们用命令行启动项目时,程序使用Kestrel作为Web服务器。部署在服务上一样的道理,服务器启动项目也是用的.NET Core CLI命令启动的。

可以有两台服务器,一个内部服务器Kestrel,一个外部服务器,外部Web服务器可以是IIS、Nginx或Apache等。

.NET Core CLI

就是在控制台使用的dotnet命令,用来运行项目,创建项目等。用dotnet命令运行项目,直接就是进程外代理,用Kestrel作为内部服务器。忽略项目文件写的进程内外

launchSettings

项目启动配置文件
image.png
环境变量ASPNETCORE_ENVIRONMENT的默认值为Development。可以将此值更改为Staging或Production,具体取决于我们是在Staging还是Production环境中运行此项目

appsettings

整个项目的各种配置信息,如数据库字符串等

用户机密

在应用程序的开发过程中,有时需要在代码中保存一些机密信息,比如加密密钥、字符串、用户名或密码等。通常的做法是将其保存到一个配置文件(如appsettings.json) 中。但是在涉及以下场景的时候就会发现该文件不够用了。
● 需要保存一些和第三方网站对接的密钥,比如微信、支付宝或微博站点使用的密钥。
● 在团队协同开发的过程中,开发人员在使用各自本机的数据库时,如何配置数据库地址、账号和密码。

在vs中右键项目名,管理用户机密
image.png
然后在这个机密里面写点东西
image.png
保存后,右键项目名,编辑项目文件
image.png
发现多了一排
image.png
这时候可以点击secrets.json文件的标签右键,打开所在的文件夹
image.png
给我在本地的C盘的下面创建了一个文件夹
image.png
用户机密信息保存在本地计算机,然后通过UserSecretsId的值来替换配置信息

开发异常页面

自定义开发异常页面

  1. //自定义开发异常页面,SourceCodeLineCount表示出现异常时,异常代码上面3行,下面3行,一共显示7行代码
  2. DeveloperExceptionPageOptions developerExceptionPageOptions = new DeveloperExceptionPageOptions { SourceCodeLineCount = 3 };
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage(developerExceptionPageOptions);
  6. }