asp.net core 程序入口详解及配置文件使用

一、应用程序文件结构

如下图所示,相比于Asp.Net项目,在新建的Asp.Net Core项目中,没有了Global.asax以及Web.config这样的文件,但多了几个其他主要的文件,它们分别为:wwwroot、appsetting.jsonProgram.cs、Startup.cs

wwwroot:

首先,Razor Pages项目中多了一个wwwroot的文件夹,这个文件夹中,主要存放网站的静态资源,如css,网站图片资源文件,js文件,三方的js库, 网站的图标等。

appsetting.json

appsetting.json是应用程序配置文件,类似于ASP.NET MVC应用程序中的Web.config配置文件。

Program.cs

这是.NET Core的程序入口文件,包含Main函数。

Startup.cs

这是 .NET Core应用程序启动配置项目文件

二、程序启动

1.Program.cs

ASP.NET Core应用程序需要由Host(宿主)进行管理,宿主为其提供运行环境并负责启动。所以Main函数主要是用来初始化宿主环境,而宿主环境的初始化需要借助WebHostBuilder。初始化完毕后,调用Run()方法来启动应用程序。

1.WebHost.CreaateDefaultBuilder():创建WebHostBuilder

2.UseStartup<Startup>():指定启动类,用于依赖注入和中间件注册。

3.Build():返回初始化完毕的IWebHost宿主。

4.Run():启动WebHost。

Program.cs

CreateDefaultBuilder():

CreateDefaultBuilder()

从上图中我们可以看出CreateDefaultBuilder()方法主要干了六件事:

UseKestrel:使用Kestrel作为Web server。

UseContentRoot:指定Web host使用的content root(内容根目录),比如Views。默认为当前应用程序根目录。

ConfigureAppConfiguration:设置当前应用程序配置。主要是读取 appsettinggs.json 配置文件、开发环境中配置的UserSecrets、添加环境变量和命令行参数 。

ConfigureLogging:读取配置文件中的Logging节点,配置日志系统。

UseIISIntegration:使用IISIntegration 中间件。

UseDefaultServiceProvider:设置默认的依赖注入容器。

创建完毕WebHostBuilder后,通过调用UseStartup()来指定启动类,来为后续服务的注册及中间件的注册提供入口,IWebHostBuilder负责创建IWebHost,然后Run()方法启动IWebHost。。

2. Startup.cs

Asp.Net Core 启动类默认命名为Startup,它是在程序入口Main()函数中为了构造IWebHost时通过UseStartup<Startup>()指定的。

该类主要包括两个方法:

2.1 ConfigureServices :

该方法一般用于配置服务将服务注册到依赖注入容器中,在Configure方法之前被调用。通过调用IServiceCollection的扩展方法进行服务注册。扩展方法的命名建议按照Add[MethodName]进行约定,比如Mvc相关服务的注册services.AddMvc()。

除此之外,我们还可以在此方法中替换ASP.NET Core默认内置的依赖注入框架。比如我们使用Castle Windsor替换:

安装Castle.Windsor.MsDependencyInjectionNuGet包;

修改方法返回值类型为IServiceProvider;

替换依赖容器:

Castle Windsor

2.2. Configure

该方法用于定义应用程序如何响应每个HTTP请求,以及配置HTTP流水线中的中间件。

Configure

该方法接受IApplicationBuilder作为参数,同时可以接受一些可选参数,如IHostingEnvironment和ILoggerFactory。而且,在ConfigureServices方法中注册的其他服务,也可以直接在该方法中通过参数直接注入使用,比如:

testservice

因为该方法用于配置整个http请求管道,所以中间件的注册要注意顺序。同样,在配置中间件时,我们同样建议遵循Use[Middleware]的命名约定,比如启用Mvc中间件app.UseMvc。

ASP.NET Core在调用之前已经默认注入了以下几个可用服务:

IConfiguration:用于读取应用程序配置。

IServiceCollection:可以理解为ASP.NET Core内置的依赖注入容器。

IApplicationBuilder:用于构建应用程序的请求管道。

IHostingEnvironment :提供了当前应用程序的运行的宿主环境配置信息。

除此之外,我们还可以使用已经注入的IServiceProvider、ILoggerFactory、ILogger、IApplicationLifetime等可用服务。这些预置服务可以注入到Startup类的构造函数或Configure方中。就像这样:

注入

ConfigureServices只支持一个参数IServiceCollection,因为所有的依赖都可以通过IServiceCollection获取,所以没有必要通过方法再注入其他服务,可以直接通过以下方式解析依赖的服务:


2.3定义多个启动类

我们看下Configure方法我们发现,通过IHostingEnvironment服务,我们可以获取当前应用程序的运行环境。代码中为开发环境启用了异常详情页面、数据库错误页面和Brower Link(支持启动多个web浏览器,并可同步刷新,一般用于跨浏览器测试),以方便我们开发调试。

ASP.NET Core默认内置了三种环境变量:Development、 Staging、Production。我们可以为每一种环境定义一个启动类,命名为Startup[Environment]即可。在启动时通过指定启动类所在的程序集名称即可根据launchSettings中的配置的ASPNETCORE_ENVIRONMENT自动加载对应的启动类。

三、应用设置

1.启动设置之launchSettings.json


launchSettings.json文件有两个配置节点:“IIS Express”、“AspNetCoreStartDemo”,这两个节点,分别对应Visual Stuido的开始调试按钮的

launchSettings.json


节点含义

2.应用程序配置 appsettinggs.json

在应用启动时的CreateDefaultBuilder()方法中,通过ConfigureAppConfiguration设置当前应用程序配置。

配置appsettings.json

在上面的代码中,可以根据不同的运行环境读取appsetting.json或appsetting.environment.json,需要注意的是,配置文件按照顺序被依次读取,后面的数据源会覆盖前面的数据源。

如下所示是一个简单的配置文件:

appsettings.json
CreateDefaultBuilder

在构建主机过程中使用appsettings.json中的配置。

3.读取配置的方式

3.1 以键-值对的形式读取配置

配置文件中的配置项,都是以键-值对的形式来体现的,所以最基础的读取方式就是直接读取键值对。

appsettings.json
取值

3.2 使用GetValue<T>

这是一个扩展方法,使用它需要安装Microsoft.Extensions.Configuration.Binder包。

取值


3.3.使用Options

这种方式需要安装Microsoft.Extensions.Options.ConfigurationExtensions包。

调用AddOptions()添加使用Options需要的服务。

定义与配置对应的实体类

MyOptions.cs
绑定整个配置到POCO对象上
绑定特定节点的配置

绑定特定节点的配置
通过构造函数注入

3.4.使用Bind

和Get<T>类似,建议使用Get<T>。

Get<T>

绑定特定节点

3.5.文件变化自动重新加载配置

IOptionsSnapshot 支持配置文件变化自动重新加载配置。使用IOptionsSnapshot也很简单,AddJsonFile有个重载,指定reloadOnChange:true即可。

reloadOnChange:true


4.命令行参数配置

命令行参数配置需要安装Microsoft.Extensions.Configuration.CommandLine包。

调用AddCommandLine()扩展方法将命令行配置Provider添加到ConfigurationBuilder中

传递参数有两种形式 :

如果为--AppId提供一个缩写的参数-a,那么执行 dotnet run -a 12345 会报在switch mappings中没有 -a 定义的错误。

幸好AddCommandLine还有一个重载,可以传一个switch mapping。

这样再运行上面的命令就不会报错了 


5.环境变量配置

环境变量配置需要安装 Microsoft.Extensions.Configuration.EnvironmentVariables 包。

调用AddEnvironmentVariables()扩展方法将环境变量配置Provider添加到ConfigurationBuilder中。

将环境变量配置Provider添加到ConfigurationBuilder

获取所有的环境变量

获取所有的环境变量

根据名称获取环境变量

根据名称获取环境变量


以上!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容