项目结构
通过vs创建一个新的ASP.NET Core项目,目录结构如下
Program
在Program类里面有个Main方法,本质上asp.net core就是一个控制台项目,项目运行的时候执行Main方法。
Main方法的作用就是配置了整个asp.net core的应用,然后就运行
Startup
整个类也是用来配置的,相对来说这个类的配置比较动态,Program里面的配置相对来说比较死板。
运行时Startup是通过一种约定来调用的,调用两个方法
public void ConfigureServices(IServiceCollection services){}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env){}
这两个方法的调用顺序就是先调用ConfigureServices,再调用Configure
ConfigureServices注册服务
ConfigureServices主要是负责配置依赖注入相关的东西
当我们这个程序应用运行的时候,有一些类型就会在这个容器里面进行注册,这些类型就叫做服务,注册了以后,在项目里面,就可以使用这些注册的实例。注册的时候该可以设置这些被请求服务的生命周期。
生命周期:
Transient:每次被请求都会生成一个新的实例 Scoped:一次web请求产生一个实例,web请求被处理完生命周期就截止了 Singleton:这个服务的实例一旦被创建,以后用这个服务的时候都会只用这一个实例,会一直存活到这个项目停止运行
namespace WebApplication4
{
//定义了一个接口,连个类实现了这个接口
public interface IAnimal
{
}
public class Cat : IAnimal
{
}
public class Dag : IAnimal
{
}
}
public void ConfigureServices(IServiceCollection services)
{
//我们要使用MVC,现在我们注册一下
services.AddControllersWithViews();
//Singleton生命周期到程序结束,注册一下我们自己写依赖服务。每当有类型请求IAnimal类型的服务,就给他返回一个Cat类型的实例
services.AddSingleton<IAnimal, Cat>();
}
public class HomeController:Controller
{
//如果IAnimal类型在IOC容器里面注册了。使用这个方法时都不用显示传参,自动帮你把你注册的那个服务返回的实例注入进去
public HomeController(IAnimal animal)
{
}
}
Configure配置管道
asp.net core的管道,会指定对这个http请求时如何响应的。
客户端发送请求到服务器的过程 客户端==============================服务器 中间的=======就是管道 客户端的请求从进入管道,在到服务器。服务器的响应进入管道,出来后到客户端。
如果这个管道里面什么都没有,那么这个请求从管道过来再回去,什么都不会发生。
中间件
如果想要项目有点作用的话,就要在管道里面放点东西。而我们把放在管道中间能处理请求的东西叫做中间件。
客户端====[身份验证中间件]====[MVC]====[其他]============服务器
请求进管道后,会根据顺序执行相应的中间件,这些中间件会拿到请求执行各种操作。在管道里面加了类内容,返回才不会是什么都没有的结果。
参数
参数里面实际对应的是两个服务,通过依赖注入的方式注入进来,是系统自动帮我们注册的。
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!");
});
});
}
静态文件
asp.net core项目的静态文件都放在,文件跟目录下的wwwroot
文件夹里面,没有这个文件夹就就创建一个
要使用静态文件,需要先在Configure方法里面使用app.UseStaticFiles();
中间件
如果wwwroot里面有一张图片,叫img.png,浏览器访问这个文件,路径是http://localhost:5000/img.png。
当然这是本地访问的路径,在服务上就把localhost:5000改成服务器地址。
//使用默认文件,必须放在静态文件之前
app.UseDefaultFiles();
//使用静态文件
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里面
DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions();
defaultFilesOptions.DefaultFileNames.Clear();
defaultFilesOptions.DefaultFileNames.Add("52abp.html");
//使用默认文件,必须放在静态文件之前
app.UseDefaultFiles(defaultFilesOptions);
//使用静态文件
app.UseStaticFiles();
UseFileServer()
UseFileServer()中间件结合了UseStaticFiles()、UseDefaultFiles()和UseDirectory Browser()中间件的功能。
DirectoryBrowser()中间件支持目录浏览,并允许用户查看指定目录中的文件。
把上面的代码修改成这样,效果一样的。
FileServerOptions defaultFilesOptions = new FileServerOptions();
defaultFilesOptions.DefaultFilesOptions.DefaultFileNames.Clear();
defaultFilesOptions.DefaultFilesOptions.DefaultFileNames.Add("52abp.html");
app.UseFileServer(defaultFilesOptions);
进程内/外托管
右键项目,打开项目文件,就是csproj文件。添加一行代码,设置为进程内托管。如果要设置为进程外托管,就把InProcess换成OutOfProcess
● InProcess的值指定要使用进程内托管模型,即在IIS工作进程(w3wp.exe)中托管ASP.NET Core应用程序。 ● OutOfProcess的值指定要使用进程外托管模型,将Web请求转发到运行Kestrel服务器的后端ASP.NET Core应用程序。
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
</Project>
用vs创建一个 新的ASP.NET Core项目时,默认使用的是进程内托管。可以不写
获取执行应用程序的进程名称
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
项目启动配置文件
环境变量ASPNETCORE_ENVIRONMENT的默认值为Development。可以将此值更改为Staging或Production,具体取决于我们是在Staging还是Production环境中运行此项目
appsettings
用户机密
在应用程序的开发过程中,有时需要在代码中保存一些机密信息,比如加密密钥、字符串、用户名或密码等。通常的做法是将其保存到一个配置文件(如appsettings.json) 中。但是在涉及以下场景的时候就会发现该文件不够用了。
● 需要保存一些和第三方网站对接的密钥,比如微信、支付宝或微博站点使用的密钥。
● 在团队协同开发的过程中,开发人员在使用各自本机的数据库时,如何配置数据库地址、账号和密码。
在vs中右键项目名,管理用户机密
然后在这个机密里面写点东西
保存后,右键项目名,编辑项目文件
发现多了一排
这时候可以点击secrets.json文件的标签右键,打开所在的文件夹
给我在本地的C盘的下面创建了一个文件夹
用户机密信息保存在本地计算机,然后通过UserSecretsId的值来替换配置信息
开发异常页面
自定义开发异常页面
//自定义开发异常页面,SourceCodeLineCount表示出现异常时,异常代码上面3行,下面3行,一共显示7行代码
DeveloperExceptionPageOptions developerExceptionPageOptions = new DeveloperExceptionPageOptions { SourceCodeLineCount = 3 };
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage(developerExceptionPageOptions);
}