探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs
原文:探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs
前言:.NET Core 3.0 SDK包含比以前版本更多的现成模板。 在本文中,我将比较ASP.NET Core 3应用程序使用的一些不同模板,并查看一些用于ASP.NET Core 3.0中的服务和中间件配置新的帮助方法。
翻译: Andrew Lock https://andrewlock.net/comparing-startup-between-the-asp-net-core-3-templates/
探索ASP.NET Core 3.0系列一:新的项目文件、Program.cs和generic host
探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation
探索ASP.Net Core 3.0系列四:在ASP.NET Core 3.0的应用中启动时运行异步任务
探索 ASP.Net Core 3.0系列五:引入IHostLifetime并弄清Generic Host启动交互
探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志
下面让我们看看ASP.NET Core的模板:
(1)ASP.NET Core Empty template
(2)ASP.NET Core Web API template
(3)ASP.NET Core Web App (Model-View-Controller) template
(4)ASP.NET Core Web App (Razor) template
除了此处所不涉及的模板之外,还有更多的模板-Blazor模板,client-side 模板,worker模板-您可以通过运行dotnet new list来查看所有模板!
一、ASP.NET Core Empty template
你可以通过 dotnet new web 创建一个空的模板,您将获得配置Generic Host的标准Program.cs和下面所示的稀疏Startup.cs:
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
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 2.x应用相比,主要区别在于端点路由的显着使用。 它是在2.2中引入的,但是只能用于MVC controllers。 在3.0中,端点路由是首选方法,此处提供了最基本的设置。
端点路由将选择执行哪个“端点”的过程与该端点的实际运行分开。 端点由路径模式和调用时要执行的操作组成。 可以是控制器上的MVC action,也可以是简单的lambda,如本示例所示,在该示例中,我们使用MapGet()创建 一个endpoint 。
UseRouting()扩展方法是查看传入请求并确定应执行哪个端点的方法。 在UseRouting()调用之后出现的任何中间件都将知道最终将运行哪个端点。 UseEndpoints()负责配置端点,也负责执行端点。
如果你对endpoint routing不熟悉,建议参考 以下文章:
- 官方文档 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-3.0
- FlyLolo https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_16.html
后面我也会具体聊聊关于endpoint routing,不要急。先往下面看。
二、The ASP.NET Core Web API template
下一个最复杂的模板是通过运行dotnet new webapi创建的Web API模板。 这包括带有一个Get方法的简单[ApiController]控制器。 Startup.cs文件(如下所示)比空模板要复杂一些,但包含许多相同方面。
默认模板中未使用IConfiguration,但IConfiguration注入到此模板的构造函数中。 在任何实际的应用程序中,您几乎都肯定需要访问它来配置服务,因此这很有意义。
在ConfigureServices中,调用了一个扩展方法AddControllers(),这是ASP.NET Core 3.0中的新增功能。 在2.x中,通常会为所有ASP.NET Core应用程序调用services.AddMvc()。 但是,这将为MVC使用的所有内容配置服务,例如Razor Pages和View呈现。 如果仅创建Web API,则这些服务是完全多余的。仅添加了创建Web API真正需要的内容,不需要的不添加,岂不更好!
net core 3.0 webapi 截图如下:
对应AddControllersCore源码如下:
net core 3.0 mvc 截图如下:
对应AddControllersWithViewsCore源码如下:
接下来是HTTPS重定向中间件,该中间件可确保在安全域上发出请求(这绝对是最佳实践)。 然后,我们将在路由的早期再次使用“路由”中间件,以便后续的中间件在确定行为方式时可以使用选定的端点。
Authorization中间件是3.0中的新增功能,并且在很大程度上归功于端点路由的引入。 您仍然可以使用[Authorize]属性装饰控制器动作,但是现在这些属性的执行在这里进行。 真正的优势在于,您可以将授权策略应用于非MVC端点,以前必须以手动,强制性方式对其进行处理。
最后,通过调用endpoints.MapControllers()映射API控制器。 这只会映射装饰有routing attributes的控制器-它不会配置任何常规路由。
三、The ASP.NET Core Web App (MVC) template
MVC模板(dotnet new mvc)包含的内容比Web API模板多了一些,但是与2.x中的等效功能相比,它已经略有减少。 只有一个控制器,即HomeController,关联的Views和所需的共享Razor模板。
Startup.cs与Web API模板非常相似,只是在下面讨论了一些区别:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
} app.UseHttpsRedirection();
app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
代替AddControllers()扩展方法,这次我们有了AddControllersWithViews。 如您所料,这将添加Web API和MVC通用的MVC Controller服务,而且还添加呈现Razor视图所需的服务。由于这是一个MVC应用程序,因此中间件管道包括针对Development外部环境的Exception handler中间件,并且还添加了与2.2相同的HSTS和HTTPS重定向中间件。
接下来是静态文件中间件,它位于路由中间件之前。 这样可以确保无需为每个静态文件请求进行路由,这在MVC应用程序中可能很常见。
与Web API模板的唯一区别是端点路由中间件中MVC控制器的注册。 在这种情况下,为MVC控制器添加了常规路由,而不是Web API典型的属性路由方法。 同样,这类似于2.x中的设置,但针对端点路由系统进行了调整。
四、ASP.NET Core Web App (Razor) template
Razor Pages 是ASP.NET Core 2.0中引入的,它是MVC的基于页面的替代方法。 对于许多应用程序,Razor Pages提供了比MVC更自然的模型,但是它基本上是基于MVC基础结构构建的,因此dotnet new webapp的Startup.cs看起来与MVC版本非常相似:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
} app.UseHttpsRedirection();
app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
此文件中的第一个更改是将AddControllersWithViews()替换为AddRazorPages()。 如您所料,这将添加Razor Pages所需的所有其他服务。 有趣的是,它没有添加将标准MVC控制器与Razor Views一起使用所需的服务。 如果要在应用程序中同时使用MVC和Razor页面,则应继续使用AddMvc()扩展方法。对Startup.cs的唯一更改是将MVC端点替换为Razor Pages端点。 与服务一样,如果您希望在应用中同时使用MVC和Razor页面,则需要同时映射两个端点。
代码如下:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers(); // Map attribute-routed API controllers
endpoints.MapDefaultControllerRoute(); // Map conventional MVC controllers using the default route
endpoints.MapRazorPages();
});
五、总结
这篇文章简要概述了使用创建各种ASP.NET Core模板的Startup.cs文件。 每个模板都为前一个模板增加了一些额外的功能,并提供了一些额外的功能。 .NET Core 3.0 SDK模板与.NET Core 2.x的模板非常相似。 最大的新功能是能够更轻松地使你的应用包含最小所需的MVC服务以及新的终点路由,这是.NET Core 3.0中的标准路由方法。
翻译: Andrew Lock https://andrewlock.net/comparing-startup-between-the-asp-net-core-3-templates/
作者:郭峥
出处:http://www.cnblogs.com/runningsmallguo/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs的更多相关文章
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(下)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation
前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...
- 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志
前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...
- 学习ASP.NET Core Razor 编程系列二——添加一个实体
在Razor页面应用程序中添加一个实体 在本篇文章中,学习添加用于管理数据库中的书籍的实体类.通过实体框架(EF Core)使用这些类来处理数据库.EF Core是一个对象关系映射(ORM)框架,它简 ...
- SonarQube系列二、分析dotnet core/C#代码
[前言] 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目.目录如下: SonarQube系列一.Linux安装与部署 SonarQube系列二.分析 ...
- Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...
- 设计模式(一)单例模式:创建模式 ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
设计模式(一)单例模式:创建模式 先聊一下关于设计的几个原则(1)单一原则(SRP):一个类应该仅有一个引起它变化的原因 :意思就是 (一个类,最好只负责一件事情,并且只有一个引起它变化的原因(2)开 ...
随机推荐
- maven 高级玩法
maven 高级玩法 标签(空格分隔): maven 实用技巧 Maven 提速 多线程 # 用 4 个线程构建,以及根据 CPU 核数每个核分配 1 个线程进行构建 $ mvn -T 4 clean ...
- wannalfy 挑战赛7 F Masha与老鼠(贪心+dp)
链接:https://www.nowcoder.net/acm/contest/56/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 6 ...
- [HDU4336]:Card Collector(概率DP)
题目传送门 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物.商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值$W_i$(每种礼物的喜悦值不能重复获得).每 ...
- [LeetCode]-DataBase-Customers Who Never Order
Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...
- html初体验#2
碎碎念 关于布局 css布局:横向.纵向 2019年新进展:css grid git bash 上安装 http server 目的在于不使用 file:// 打开自己写的文件,使用 http:// ...
- 一句话搞定python六剑客
六剑客 一行搞定六剑客:三个函数:map filter reduce + lambda 切片 推导列表 python最有特点的一行代码,所有代码均可以借用一行代码(目标) 1.map(函数,列表或者字 ...
- Linux shell - 找到进程pid,然后杀掉(jps, grep, awk)
在应用服务器上,启动一个应用程序F3后,一直挂着,如果想要关闭它话,可以使用jps找到它的pid,然后,使用kill命令杀掉这个pid,例如: $> jps 17337 Jps 6660 Mai ...
- SVN appears to be part of a Subversion 问题心得
昨天更新了下项目,但同时又增加了一个Java工程,我就在本地单独导出到workspace同目录下:结果第二天提交代码的时候,提示如下错误 svn: E155021: The path 'xxx' ap ...
- always_populate_raw_post_data
Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a futu ...
- 微信小程序的 音频 组件
audio:音频组件, api 接口为 wx.createInnerAudioContext audio 组件的属性: id:类型 字符串 audio 组件的唯一标识 src:类型 字符串 要播放音频 ...