ASP.NET Core 3.0创建项目

作者 Zhendong Ho 日期 2019-11-25
ASP.NET Core 3.0创建项目

创建ASP.NET Core项目

打开Visual Studio 2019,点击创建项目,选择ASP.NET Core Web 应用程序。

1574346123789

点击编辑项目文件,可以看到项目的框架是.NET Core 3.0。

1574347099007

项目结构

ASP.NET Core项目的本质是一个.NET Core控制台项目,项目结构如下。

1574347143374

Program类

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}

Main方法:程序执行的入口,配置整个应用并运行

CreateHostBuilder方法:调用CreateDefaultBuilder方法,对WebHost进行配置,如处理配置文件、路由等。

Startup类

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 用于配置依赖注入
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 判断是否开发模式
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage(); // 发生错误时把信息展示到页面的中间件
}

app.UseRouting(); // 路由中间件

app.UseEndpoints(endpoints => // 端点中间件,使用Lambda表达式
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
}
}

Startup类用于相对动态的配置(相对CreateHostBuilder)。

调用顺序:先调用ConfigureServices,再调用Configure

ConfigureServices:负责配置依赖注入相关内容。

Configure:配置了ASP.NET Core处理HTTP请求的管道(注册中间件)

DI依赖注入

IOC容器

当应用程序启动时,一些类型会在容器中进行注册。这些类型称为服务(services)。注册之后,其他的类型或它本身,都可以向IOC容器请求这些注册的实例。另外,注册的时候可以设定这些实例的生命周期

生命周期

Transient:services每次被请求时生成新的实例。

Scoped:一次web请求产生一个实例,web请求处理完生命周期结束。

Singleton:实例一旦被创建,所有请求使用同一个实例,直到应用程序停止。

注册MVC服务

例:通过依赖注入注册一个MVC服务。

public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(); // 注册MVC
// services.AddRazorPages(); // 支持RazorPgae
// services.AddController(); // 用于WebAPI
// services.AddMvc(); // 功能最多
}

注册自定义服务

项目右键,新建文件夹Services,在Services下新建接口IClock。

public interface IClock
{

}

新建ChinaClock实现IClock接口。

public class ChinaClock : IClock
{

}

新建UtcClock实现IClock接口。

public class UtcClock : IClock
{

}

在Startup类中注册ChinaClock服务。

public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddSingleton<IClock, ChinaClock>(); // 每当有其他类型实现IClock时,返回ChinaClock实例
}

使用服务

项目右键,添加文件夹Controllers,在Controllers下新建类HomeController。

public class HomeController : Controller
{
public HomeController(IClock clock) // 通过构造函数注入
{

}
}

DI的优点

  1. 解耦,没有强依赖,利于单元测试。
  2. 不需要了解具体的服务类。
  3. 也不需要管理服务类的生命周期。

ASP.NET Core管道

ASP.NET Core管道(pipeline)可以指定应用程序如何响应HTTP请求

原理:ASP.NET Core从浏览器接收到HTTP请求,请求从浏览器进入管道,处理完后从管道回去。我们把管道中间的,可以处理请求的内容称为中间件,如MVC、Auth等。

1574692790466

路由

端点endpoint

端点就是进来的HTTP请求的url结尾的那部分,这部分会被中间件进行处理。如:

// /{controller}/{action}
// /home/index

路由中间件

在ASP.NET Core 3.0, 路由中间件从MVC中被分离出来,单独作为一个中间件使用。

多种ASP.NET Core应用都需要使用路由中间件

  • MVC:/Home/Index
  • Razor Pages:/SomePage
  • SignalR:/Hub/Chat

配置路由的方式:有两种方法。一种是在Controller前加上Attribure,另一种是配置路由模板

例:在Configure类中注册路由中间件以及配置路由模板。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseRouting(); // 注册路由中间件

app.UseEnpoints(endpoints => // 注册端点中间件,这里配置路由模板
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
// 如果使用Attribute配置路由,则使用以下方法
// endpoints.MapControllers();
});
}

其他中间件

其他web应用需要使用的中间件,如静态文件和身份认证中间件。注意中间件的注册顺序很重要,中间件注册的顺序就是HTTP请求在管道中处理的顺序

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...

app.UseStaticFiles(); // 静态文件中间件,可写在路由中间件前,不需要知道路由信息

app.UseHttpRedirection(); // 把HTTP请求转换成HTTPS请求

app.UseRouting(); // 路由中间件

app.UseAuthentication(); // 身份认证中间件,必须写在UseEndpoints前,使用框架前必须要身份认证

endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}

运行ASP.NET Core应用

有两种方式运行。第一种是通过IIS Express(不推荐),第二种是运行ASP.NET Core应用(控制台)。推荐使用第二种。

1574774746653

配置运行的方式

有两种方式可以修改项目相关配置

  • 项目右键,点击属性,选择调试。

1574774916243

  • 打开项目文件夹,Properties目录下的launchSettings.json文件(项目中不可见),该文件对应上面的配置内容。

    1574775328865

    如果不需要使用IIS Express,可以删除IIS的相关配置。

设置环境变量

通过修改环境变量ASPNETCORE_ENVIRONMENT,可以在Startup类的Configure方法判断不同的环境

例:自定义环境变量。

1574776092042

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsEnvironment("Ok"))
{
app.UseDeveloperExceptionPage();
}
// ...
}

环境配置方法

ASP.NET Core可以根据不同的配置环境,写不同的配置方法。

例:使用ConfigureDevelopment配置开发环境。

public void ConfigureDevelopment(IApplicationBuilder app, IWebHostEnvironment env)
{
// 开发环境的配置
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
}

注意ConfigureServices方法Startup类,也可以使用这种约定名称来配置环境方法环境类

静态文件

wwwroot文件夹

wwwroot文件夹是一个特殊的文件夹,用于存放静态文件,如javascript、css、图片、字体等。

项目右键,添加wwwroot文件夹,在wwwroot下添加images文件夹,在images下添加图片。

1574777386631

运行项目,在地址栏输入localhost:5001/images/ae86.jpg,即可看到图片。

1574777483224

注意:由于配置中使用UseStaticFiles方法注册了静态文件中间件,否则无法获取静态资源。

包管理

  • 服务器端(后端):Nuget
  • 前端:Npm

通过Npm安装Bootstrap

项目右键,添加npm配置文件。

1574780530920

在配置文件中,添加bootstrap,选择最新版本,保存的时候自动安装。

1574780711546

安装完成后,可以在项目路径的node_modules目录下,看到安装好的Bootstrap(项目中不可见)。

注意:如果删除bootstrap,只需要在json文件中删除,保存后会自动删除对应的包和目录

通过libman安装Bootstrap

libman是Visual Studio自带的工具。

项目右键,添加客户端库,提供程序选择unpkg,库输入bootstrap@4.3.1,确认目标位置,安装。

1574781587927

安装完成后,有如下改变:

  1. 把文件添加到指定的目录中。
  2. 项目中增加了一个libman.json文件。

1574781747921

合并和压缩css

在wwwroot下创建css文件夹,在css下添加site.css。

使用bundle合并

项目右键,新建bundleconfig.json文件,配置以下内容。

[
{
"outputFileName": "wwwroot/css/all.min.css",
"inputFiles": [
"wwwroot/lib/bootstrap/dist/css/bootstrap.css",
"wwwroot/css/site.css"
]
},
{
"outputFileName": "wwwroot/css/bootstrap.css",
"inputFiles": [
"wwwroot/lib/bootstrap/dist/css/bootstrap.css"
],
"minify": {
"enabled": true
}
}
]

第一项:把site.css和bootstrap.css合并为all.min.css。

第二项:把bootstrap.css移动到wwwroot/css/bootstrap.css,并使用minify工具压缩

通过Nuget安装BuildBundlerMinifier包

项目右键,点击管理Nuget程序包,把BuildBundlerMinifier安装到项目中。点击rebuild项目。

看到目录下有对应的文件了。

1574783687508