ASP.NET Core 项目文件
- .csproj 是根据编程语言的文档所使用
- 不需要卸载项目就可以编辑项目文件。
- 项目文件不包含任何文件夹或文件引用。
- 文件系统确定哪些文件和文件夹属于项目。
TargetFramework
- 在应用程序中指定你的目标框架(TargetFramework)
- 指定目标版本需要用到的TargetFrameworkMoniker(TFM)
AspNetCoreHostingModel
- 指定应用程序的托管形式。
- InProcess还是OutOfProcess。
- InProcess的值指定我们想要使用进程内托管模型,即在IIS工作进程(w3wp.exe)中托管我们的ASP.NET Core应用程序。
- OutOfProcess的值指定我们要使用进程外托管模型,即将Web请求转发到后端的ASP.NET Core中,而整个应用程序是运行在ASP.NET Core 中内置的Kestrel中。
- Asp.Net Core 默认采用的是OutOfRrocess托管。
PackageReference
- 用于包含对应用程序安装的nuget包的引用
- Metapackage(综合包)-Microsoft.AspNetCore.App
- Metapackage本身是没有任何内容的
- 他只是包含了其他的包依赖列表信息
- 如果没有指定版本,则通过使用SDK隐式指定一个版本。
- .NET Core团队建议依赖SDK指定的隐式版本,而不是在包引用上显式设置版本号。
ASP.NET Core中的Main方法
- 控制台应用程序通常有一个Main方法
- 为什么我们在ASP.NET Core Web应用程序中有一个Main方法
- ASP.NET Core 应用程序在大部分情况下作为控制台应用程序
- 启动**Main()**方法配置ASP并启动它到那时,它就变成了一个ASP-NETCore网络应用程序
- 通过配置Main()方法,然后启动ASP.NET Core,这时它就变成了一个ASP.NET Core web应用程序
ASP.NET Core 进程内(InProcess)托管
-
**CreateDefaultBuilder()**执行的一些任务
- 设置Web服务器
- 加载主机和应用程序配置表信息
- 配置日志记录
-
ASP.NET Core应用程序的托管形式
- 在InProcess(进程内托管)或者
- OutOfProcess(进程外托管)
ASP.NET Core 进程内(InProcess)托管
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmCO2MSL-1586823839800)(image\image-20200201222051963.png)]
<AspNetCoreHostingModel>InProcess </AspNetCoreHostingModel>
-
在InProcess托管的情况下,CreateDefaultBuilder()方法调用UselIS()方法并在IlS工作进程(w3wp.exe或isexpress.exe)内托管应用程序。
-
从性能的角度来看,InProcess托管比OutOfProcess托管提供了更高的请求吞吐量。
-
获取执行应用程序的进程名称
-
System.Diagnostics.Process.GetCurrentProcess().ProcessName
-
什么是OutOfProcess托管?
- 有2个Web服务器-内部Web服务器和外部Web服务器。
- 内部Web服务器是Kestrel,
- 外部Web服务器可以是IIS,Nginx或Apache。
-
什么是Kestrel Web Server?
- Kestrel是ASP.NET Core的跨平台Web服务器
- Kestrel本身可以用作边缘服务器。
- Kestrel中用于托管应用程序的进程是dotnet.exe
-
进程内托管
- 该应用程序托管在IIS工作进程中
- 只有一个Web服务器
- 从性能角度来看,在进程托管中,优于进程外托管
ASP.NET Core 进程外(out-of-Process)托管
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pRmzyoRp-1586823839804)(image\image-20200201222015099.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uUbmmvvW-1586823839805)(image\image-20200201222444411.png)]
program与startup
-
这两个cs文件是asp.net系统中最重要的组成部分,分别主管程序入口及系统生命周期,startup.cs集中管理了系统的依赖注入,中间件midware,请求通道request pipeline,学习一门新技术最好的方法就是从其启动入口开始。asp.net core 程序入口就是program.cs中的主函数main
-
program.cs文件main函数,.net core应用程序实际上就是个console app,createdefaultbuilder创建并运行一个虚拟网站托管主【加载主机和应用程序的配置信息】【配置日志记录】【设置web服务器】【设置.netcore应用程序的托管形式】
-
startup.cs是.netcore sdk默认生成的,在configureservices里注入各种服务组件的依赖【在.net运行时调用,.net core 提供了内置的ioc容器,该方法就是将自己的服务注入到ioc容器中】,在configure中设置中间件midware,请求通道request pipeline【配置系统的http请求通道,检查处理http请求,交由中间件middleware处理,该方法的环境变量由右键解决方案属性debug中设置或是properties文件夹中launchsetting.js中设置】。
-
中间件/请求通道:
- 基本通过IApplicationBuilder创建
- 每个中间件都可以截获、修改、并且传递请求对象,输出响应对象
- 在特定情况下,某些中间件可以做短路处理,直接向前端输出相应对象
-
中间件顺序
-
向
Startup.Configure
方法添加中间件组件的顺序定义了针对请求调用这些组件的顺序,以及响应的相反顺序。 此顺序对于安全性、性能和功能至关重要 -
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); // app.UseRequestLocalization(); // app.UseCors(); app.UseAuthentication(); // app.UseSession(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
-
以下
Startup.Configure
方法将为常见应用方案添加中间件组件:- 异常/错误处理
- 当应用在开发环境中运行时:
- 开发人员异常页中间件 (UseDeveloperExceptionPage) 报告应用运行时错误。
- 数据库错误页中间件 (
Microsoft.AspNetCore.Builder.DatabaseErrorPageExtensions.UseDatabaseErrorPage
) 报告数据库运行时错误。
- 当应用在生产环境中运行时:
- 异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。
- HTTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加
Strict-Transport-Security
标头。
- 当应用在开发环境中运行时:
- HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。
- 静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。
- Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例 (GDPR) 规定。
- 身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。
- 会话中间件 (UseSession) 建立和维护会话状态。 如果应用使用会话状态,请在 Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。
- MVC (UseMvc) 将 MVC 添加到请求管道。
- 异常/错误处理
-
路由
传统路由
- 默认路由
- 映射资源必须保存在服务器中
- url的相对路径必须于请求路径一致
- 无法服务动态文件
- 文件必须带有后缀
- 暴露服务器的文件结构
app.UseMvc(routes=>
{
routes.MapRoutes(
name:"default",
template:"{controller=Home}/{action=Index}/{id?}"
);
或者这样写
app.UseMvc(routes =>
{
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});
还可以这样写
app.UseMvcWithDefaultRoute();
UseMvc
和 UseMvcWithDefaultRoute
可向中间件管道添加 RouterMiddleware
的实例
-
总结
它为 URL 路径设立了一个约定:
- 第一个路径段映射到控制器名称
- 第二段映射到操作名称。
- 第三段用于可选
id
(用于映射到模型实体)
属性路由
将针对任意 URL 路径 /
、/Home
或 /Home/Index
执行 HomeController.Index()
操作
app.UseMvc() //不加内容
使用属性路由时,控制器名称和操作名称对于操作的选择没有影响。
使用 Http[Verb] 属性的属性路由(通常适用于API而不适用于MVC)
- 生成 REST API 时,很少会在操作方法上使用
[Route(...)]
这是因为该操作将接受所有 HTTP 方法。 建议使用更特定的Http*Verb*Attributes
来明确 API 所支持的操作。 REST API 的客户端需要知道映射到特定逻辑操作的路径和 Http 谓词。 - 若要使属性路由减少重复,可将控制器上的路由属性与各个操作上的路由属性合并。 控制器上定义的所有路由模板均作为操作上路由模板的前缀。 在控制器上放置路由属性会使控制器中的所有操作都使用属性路由。
[Route("products")]
public class ProductsApiController : Controller
{
[HttpGet]
public IActionResult ListProducts() { ... }
[HttpGet("{id}")]
public ActionResult GetProduct(int id) { ... }
}
-
应用于操作的以
/
或~/
开头的路由模板不与应用于控制器的路由模板合并 -
属性路由支持标记替换,方法是将标记用大括号(
[
、]
)括起来。 标记[action]
、[area]
和[controller]
替换为定义了路由的操作中的操作名称值、区域名称值和控制器名称值。
仓库
-
IEnumerable 是 System.Collections.Generic 命名空间中的集合的基接口,如 List、Dictionary和 Stack 以及其他泛型集合,如 ObservableCollection 和 ConcurrentStack。 可以通过使用
foreach
语句来枚举实现 IEnumerable 的集合。 -
依赖注入
-
仓库注册
services.AddTransient<INoodleRepository,MockNoodleResposity>();//每次发起请求后创建一个全新的仓库,请求结束后自动注销这个仓库
services.AddSingleton<>();//系统启动有且仅创建一个仓库,系统每次请求使用同一个仓库实例
services.AddScoped<>();//将一系列请求或操作整合在一个事务里,这个事务有且仅创建一个实例,事务结束后会自动注销这个实例
-
MVVM与MVC
EF core
services.AddDbContext<SchoolContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
Add-Migration InitialCreate
Update-Database
束后会自动注销这个实例
MVVM与MVC
EF core
services.AddDbContext<SchoolContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
Add-Migration InitialCreate
Update-Database