当前位置: 首页 > 编程日记 > 正文

Asp.Net Core 入门(一)——Program.cs做了什么

ASP.NET Core 是微软推出的一种全新的跨平台开源 .NET 框架,用于在 Windows、Mac 或 Linux 上生成基于云的新式 Web 应用程序。国内目前关于Asp.Net Core的书比较少,自己靠着阅读微软官方文档,源码和在52ABP梁老师的教程中慢慢的在一点点的积累Asp.Net Core的知识。因此希望将自己的学习记录下来,以此巩固和交流。

闲话不多说,我们知道学习一门新的技术,最好的方法就是从它的启动入口进行跟踪,那么接下来我们先来看下Asp.Net Core的入口文件Program.cs。

笔者使用的.Net SDK 是 2.2版本,所以下面的介绍都是基于2.2版本的。

    public class Program{public static void Main(string[] args){CreateWebHostBuilder(args).Build().Run();}public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();}

我们看到Program中Main函数很像我们之前的Console应用程序,那么它当中的CreateWebHostBuilder究竟做了什么事情呢?既然.Net Core是开源的,我们看源码就方便了很多,接下来就从源码来了解下它究竟做了什么工作。

     /// <summary>/// Initializes a new instance of the <see cref="WebHostBuilder"/> class with pre-configured defaults./// </summary>/// <remarks>///   The following defaults are applied to the returned <see cref="WebHostBuilder"/>:///     use Kestrel as the web server and configure it using the application's configuration providers,///     set the <see cref="IHostingEnvironment.ContentRootPath"/> to the result of <see cref="Directory.GetCurrentDirectory()"/>,///     load <see cref="IConfiguration"/> from 'appsettings.json' and 'appsettings.[<see cref="IHostingEnvironment.EnvironmentName"/>].json',///     load <see cref="IConfiguration"/> from User Secrets when <see cref="IHostingEnvironment.EnvironmentName"/> is 'Development' using the entry assembly,///     load <see cref="IConfiguration"/> from environment variables,///     load <see cref="IConfiguration"/> from supplied command line args,///     configure the <see cref="ILoggerFactory"/> to log to the console and debug output,///     and enable IIS integration./// </remarks>/// <param name="args">The command line args.</param>/// <returns>The initialized <see cref="IWebHostBuilder"/>.</returns>public static IWebHostBuilder CreateDefaultBuilder(string[] args){var builder = new WebHostBuilder();if (string.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey))){builder.UseContentRoot(Directory.GetCurrentDirectory());}if (args != null){builder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());}builder.ConfigureAppConfiguration((hostingContext, config) =>{var env = hostingContext.HostingEnvironment;config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);if (env.IsDevelopment()){var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));if (appAssembly != null){config.AddUserSecrets(appAssembly, optional: true);}}config.AddEnvironmentVariables();if (args != null){config.AddCommandLine(args);}}).ConfigureLogging((hostingContext, logging) =>{logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));logging.AddConsole();logging.AddDebug();logging.AddEventSourceLogger();}).UseDefaultServiceProvider((context, options) =>{options.ValidateScopes = context.HostingEnvironment.IsDevelopment();});ConfigureWebDefaults(builder);return builder;}
 internal static void ConfigureWebDefaults(IWebHostBuilder builder){builder.UseKestrel((builderContext, options) =>{options.Configure(builderContext.Configuration.GetSection("Kestrel"));}).ConfigureServices((hostingContext, services) =>{// Fallbackservices.PostConfigure<HostFilteringOptions>(options =>{if (options.AllowedHosts == null || options.AllowedHosts.Count == 0){// "AllowedHosts": "localhost;127.0.0.1;[::1]"var hosts = hostingContext.Configuration["AllowedHosts"]?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);// Fall back to "*" to disable.options.AllowedHosts = (hosts?.Length > 0 ? hosts : new[] { "*" });}});// Change notificationservices.AddSingleton<IOptionsChangeTokenSource<HostFilteringOptions>>(new ConfigurationChangeTokenSource<HostFilteringOptions>(hostingContext.Configuration));services.AddTransient<IStartupFilter, HostFilteringStartupFilter>();services.AddRouting();}).UseIIS().UseIISIntegration();}

从源码中我们可以看到,CreateDefaultBuilder执行的任务有:

1、加载主机和应用程序的配置表信息

2、配置日志记录

3、设置Web服务器

4、设置Asp.Net Core应用程序的托管形式。

现在我们来看一下Asp.Net Core是如何加载配置的。

访问配置信息可以通过 IConfiguration 接口进行访问,我们从源码也可以看到,Asp.Net Core加载配置的过程,它们之间是按照顺序如果有相同的配置会依次被覆盖:appsettings.json,appsettings{Environment}.json(应用程序配置文件) -->User Secrets(用户机密) --> Environment Variables(环境变量) --> Command-line arguments(命令行参数)。

其中应用程序配置文件的{Environment}可以在项目的属性中调试进行配置,如果项目中不存在单独为某个环境配置的,采用appsettings.json。

应用程序配置文件我们比较清楚,以前在.Net Framework我们有web.config,但是Asp.Net Core中出现了User Secrets用户机密,那么它有什么用呢,其实它可以保存我们比较敏感的配置信息,比如第三方的Key,像微信的Appkey之类的。那我们该如何添加User Secrets呢?我们需要在命令行的窗口下,切换到我们项目的执行文件夹下,即bin所在的那层目录,运行命令dotnet user-secrets set [KeyName] [KeyValue]

接着我们就可以在VS项目中查看到该用户机密了

Environment variables(环境变量)在 Properties文件夹下的launchSettings.json进行配置

{"iisSettings": {"windowsAuthentication": false,"anonymousAuthentication": true,"iisExpress": {"applicationUrl": "http://localhost:4084","sslPort": 44338}},"profiles": {"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}},"StudentManagement": {"commandName": "Project","launchBrowser": true,"applicationUrl": "https://localhost:5001;http://localhost:5000","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}}}
}

这里的profiles可以在VS调试运行的时候做选择

而Command-line arguments(命令行参数)需要结合命令行窗口执行: dotnet run KeyName="KeyValue"。

那么我们怎么获取配置信息呢? Asp.Net Core提供了ConfigureAppConfiguration 可以给我们调用获取配置,在StartUp文件中可以使用 _configuration["KeyName"] 来获取。

  最后,我们再看一下Asp.Net Core应用程序的托管形式,它有两种托管形式:进程内托管InProcess和进程外托管OutOfProcess。我们知道Asp.Net Core是可以自托管的,它默认托管形式就是InProcess。那么这两种方式的区别是什么呢?

  InProcess:配置进程内托管在项目.csproj文件中 <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>,在InProcess托管情况下,CreateDefaultBuilder()方法调用UseIIS()方法并在IIS工作进程(w3wp.exe或iisexpress.exe)内托管应用程序,从性能角度,InProcess托管比OutOfProcess托管提供了更高的请求吞吐量。

  OutOfProcess:有2个Web服务器-内部Web服务器和外部Web服务器,内部Web服务器是Kestrel,托管进程是dotnet.exe;外部web服务器可以是iis,nginx,apache。

  现在我们知道了CreateDefaultBuilder做了什么工作了,那么在它之后调用了UseStartup<Startup>(),那Startup做了什么工作呢,我们下篇再来讨论。

  

转载于:https://www.cnblogs.com/jesen1315/p/11038385.html

相关文章:

LTE MIBSIB1

LTE MIB/SIB1 LTE MIB/SIB 消息可以参考&#xff1a;http://blog.csdn.net/wowricky/article/details/51348613 UE 接受完MIB/SIB1后就可以判断这个CELL是否可以驻留&#xff0c;这里仅仅讨论与驻留 (Camp on)相关的参数。 1. MIB 包含BW/PHICH/SFN 2. SIB1 包含小区接入信…

python 加载动图_在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...

大数据文摘授权转载自数据派THU作者&#xff1a;MOHD SANAD ZAKI RIZVI本文主要介绍了&#xff1a;TensorFlow.js (deeplearn.js)使我们能够在浏览器中构建机器学习和深度学习模型&#xff0c;而无需任何复杂的安装步骤。TensorFlow.js的两个组件——Core API和Layer API。了解…

mySQL笔记(1)

1.show databases; 显示所有数据库 2.create database 数据库名 [其他选项]&#xff1b; 新建数据库 例&#xff1a;create database example_db character set gbk; 创建了一个名为example_db的数据库&#xff0c;并将数据库字符编码指定为gbk,便于在命令提示符下显…

Loadrunner进行md5加密方法

本文主要介绍使用Loadrunner进行字符串md5加密的方法。 使用Loadrunner进行md5比较简单&#xff0c;首先是加载md5.h头文件&#xff0c;后使用头文件中的加密函数即可。 1. md5.h头文件内容如下 #ifndef MD5_H #define MD5_H #ifdef __alpha typedef unsigned int uint32; #els…

6 Java Shell排序

希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序&#xff0c;待整个序列中的记录“基本有序”时&#xff0c;再对全体记录进行依次直接插入排序。 1、基本思想 将待排序数组按照步长gap进行分组&#xff0c;然后将每组的元素利用直接插入排序的方法…

如何向非技术人员解释“稀疏傅里叶变换”算法?

【伯乐在线导读】&#xff1a;这个问题来自 Quora&#xff0c;下面是来自 Tanooj Luthra 的回复。 让我们来演奏一架想象中的钢琴。 钢琴的每个琴键都对应一个特定频率的声音。例如&#xff0c;一个比较有名的频率是国际标准音A&#xff08;440赫兹&#xff09;。当有琴键按下时…

N皇后摆放问题

Description 在N*N的方格棋盘放置了N个皇后&#xff0c;使得它们不相互攻击&#xff08;即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45角的斜线上。你的任务是&#xff0c;对于给定的N&#xff0c;求出有多少种合法的放置方法。 Inp…

java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...

第12章 Java内存模型与线程前言&#xff1a;1、物理机如何处理并发问题&#xff1f;2、什么是Java内存模型&#xff1f;3、原子性、可见性、有序性的具体含义和应用实现&#xff1f;4、volatile 关键字特性&#xff1f;5、基于volatile变量的运算在并发下是否是线程安全的&…

动软代码生成V2.74模版简介

最近发现很多人用动软代码生成&#xff0c;确实方便&#xff0c;有些经验记录下&#xff0c;以后查看回顾。 ..\Maticsoft\Codematic2\Template\TemplateFile 为模板文件夹&#xff0c;直接在目录下新建文件夹【我的自定义模版】,有个【模版示例.cmt】也直接复制到自定义文件下…

《少年先疯队》第九次团队作业:Beta冲刺第二天

2.1 今日完成任务情况 姚玉婷&#xff1a;房间管理功能测试文档的编写马丽莎&#xff1a;酒店系统中商品管理功能的完善张 琼&#xff1a;商品管理功能的测试孙苗坤&#xff1a;商品管理功能的测试2.2 明天任务安排 姚玉婷&#xff1a;酒店系统中剩余功能的完善马丽莎&#x…

傅里叶变换的参考文档

https://betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/ http://blog.jobbole.com/70549/

取消ssh密钥文件登录_Xshell密钥登入,增加安全

1.点击Xshell菜单栏的工具&#xff0c;选择新建用户密钥生成向导&#xff0c;进行密钥对生成操作。2.这个时候&#xff0c;你已经有了一对密钥&#xff0c;需要开始设定服务器的配置&#xff0c;启用密钥认证登录&#xff0c;同时为了系统安全着想&#xff0c;关闭密码认证的方…

20150726 填坑日记

三中内填坑&#xff1a; 1. 组合数递推什么的 C(m,n)C(m,n-1)C(m-1,n-1)。填了个大坑&#xff0c;以前没认真听课QAQ 2. 裸题过河卒 3. 缺角正方形摆放车统计&#xff0c;分上下部分&#xff0c;枚举上部分放几个即可&#xff0c;O(n) 4. 3d立体图统计表面积&#xff1a;先把上…

Word 2003文件保存和另存为操作是否熟练掌握的有关测试

提出问题本文内容不仅适用于Word&#xff0c;对于其他的文档&#xff08;文字、图形、动画、声音等&#xff09;编辑软件基本通用。对于操作上述各种编辑软件时&#xff0c;大家都应该注意到&#xff0c;我们第一次保存文件时系统出现的是“另存为”对话框。此后&#xff0c;再…

kdress学习

这两天看了一本书叫《linux二进制分析》&#xff0c;这里面提到的一个小工具kdress&#xff0c;这里分析一下 源码在&#xff1a;https://github.com/elfmaster/kdress kdress介绍 /boot目录下有一个vmlinux的文件&#xff0c;这是一个经过压缩的linux内核&#xff0c;不过缺少…

什么是DCI? 它有什么用?

当你学习LTE的物理帧(physicalframe)结构时,你肯定会有所体会&#xff1a;”靠&#xff0c;怎么这么复杂啊”.物理帧结构是时域 (Time Domain)、频域(Frequency Domain)和调制方式&#xff08;modulation scheme&#xff09;的组合。 你可能会有疑问&#xff1a;”接收方怎么知…

判断小数是否相等_四年级上册数学填空+计算+判断易错题整理练习,收藏练一练!...

四年级数学易错题练习一、填空题1、1.250.8表示( )。2、去掉0.25的小数点&#xff0c;就是把这个数扩大( )&#xff1b;把50.4的小数点向左移动两位&#xff0c;就是把它缩小到原来的( )。3、两个因数相乘, 一个因数扩大10倍&#xff0c;另一个因数扩大…

jquery checkbox勾选/取消勾选的诡异问题

$("input[idsubmit2]").click(function() {   $("[idpostage2]").prop("checked", true); }); $("input[idsubmit3]").click(function() {   $("[idpostage2]").prop("checked", false); }); 解决办法&#x…

C#_uploadify_mvc_version

jQuery Uploadify在ASP.NET MVC3中的使用 1、Uploadify简介 Uploadify是基于jQuery的一种上传插件&#xff0c;支持多文件、带进度条显示上传&#xff0c;在项目开发中常被使用。 Uploadify官方网址&#xff1a;http://www.uploadify.com/ 2、ASP.NET MVC3中的使用Uploadify 搭…

Velocity Engine基础

回到顶部Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据 , 填充到模板中,从而实现界面和java代码的分离!Velocity Template Language (VTL) , 是Velocity 中提供的一种模版语言 , 旨在提供最简单和最干净的方法来将动态内容合并到网页中。简单来说VTL可以将程序中的动态数展示到网页中注释非解析内容 , 引用和指令。

mysql唯一索引与null

根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该不违反唯一约束,所以是合理的,在oracel也是如此。在mysql 的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。有上面的表和数据可以看出,查询多条数据。

矩阵乘法递归求解

给定两个NN的矩阵&#xff0c;求乘积 如下图所示&#xff0c;乘法执行过程如下&#xff1a; 1.矩阵1先拿出一行&#xff0c;矩阵2先拿出一列 2.行与列相乘得到value1 3.行与剩下矩阵2相乘得到value2&#xff08;递归过程&#xff09; 4.剩下矩阵1与列相乘得到value3&#xff08…

What is acceptable cell and suitable cell in LTE?

The difference between acceptable cell and suitable cell in LTE is given below. acceptable cell In a area where UE is not able to find any suitable cell to camp on, it goes for acceptable cell. An “acceptable cell” is a cell on which the UE may camp to o…

appium 控件定位

转自&#xff1a;http://www.2cto.com/kf/201410/340345.html AppiumDriver的各种findElement方法的尝试&#xff0c;尝试的目标应用是SDK自带的Notepad应用。 1. findElementByName 1.1 示例 ?12el driver.findElementByName("Add note");assertThat(el.getText()…

android应用去掉状态栏_Android 显示、隐藏状态栏和导航栏

Android 显示、隐藏状态栏和导航栏控制状态栏显示&#xff0c;Activity的主题中配置全屏属性true控制状态栏显示&#xff0c;在setContentView之前设置全屏的flaggetWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREE…

hdu1305Immediate Decodability(字典树)

这题看是否 这题能A是侥幸&#xff0c;解决的办法是先存一下输入的字符串&#xff0c;进行排序。 Problem DescriptionAn encoding of a set of symbols is said to be immediately decodable if no code for one symbol is the prefix of a code for another symbol. We will …

python isdigit()

isdigit(): Python isdigit() 方法检测字符串是否只由数字组成。如果字符串只包含数字则返回 True 否则返回 False。 实例 以下实例展示了isdigit()方法的实例&#xff1a; #!/usr/bin/python3str "123456"; print (str.isdigit()) str "Runoob example....wo…

Control Channel Element (CCE)

1. CCE是PDCCH的资源单元 (resourceunit)。 A PDCCH is transmitted on one CCE or anaggregation of several consecutive CCEs, where a CCE corresponds to 9 Resource ElementGroups (REGs). In PDCCH transmission, only those REGs are used which are notassigned …

phpstrom+xdebug调试PHP代码

众所周知开发PHP的IDE种类繁多&#xff0c;然而开发PHP并不能像开发其他语言一样&#xff0c;调试PHP代码对诸多新手来说&#xff0c;搭建调试环境就比较麻烦&#xff01;其实哈&#xff0c;我发现NuSphere-phped-16.0很强大&#xff0c;集成了很强大的debug功能&#xff0c;只…

ubuntu 设置开机执行脚本_ubuntu-18.04 设置开机启动脚本

ubuntu-18.04 设置开机启动脚本参阅下列链接ubuntu-18.04不能像ubuntu14一样通过编辑rc.local来设置开机启动脚本&#xff0c;通过下列简单设置后&#xff0c;可以使rc.local重新发挥作用。1、建立rc-local.service文件sudo vi /etc/systemd/system/rc-local.service2、将下列内…