一、应用程序文件结构

如下图所示,相比于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

获取所有的环境变量

 

获取所有的环境变量

根据名称获取环境变量

 

根据名称获取环境变量

文章出处:https://www.jianshu.com/p/01721c257b4e

net core体系-web应用程序-3项目结构、配置文件详解的更多相关文章

  1. net core体系-web应用程序-2项目简单案例

    阅读目录   NO1 留言板(mysql的使用) NO2 聊天室(WebSocket的使用) NO3 找工作(AngleSharp的使用) 部署多个站点 一些其它的细节 部署阿里云 mysql的客户端 ...

  2. net core体系-web应用程序-4asp.net core2.0 项目实战(任务管理系统)-2项目搭建

    系统要求 首先建议采用 Windows 10 专业版/企业版/教育版,且必须是64位操作系统,原因是docker装起来比较方便,Win7装起来比较麻烦,且不确定是否有其他问题(自己没有实践过) 其次W ...

  3. net core体系-web应用程序-4net core2.0大白话带你入门-2asp.net core新建项目

    新建asp.net core项目   开发环境:Windows Server R2 2008 开发工具:Microsoft Visual Studio 2017 新建asp.net core项目 创建 ...

  4. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了   原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...

  5. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第一章 入门篇-开篇及总体规划

    .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划   原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来 ...

  6. 一步步构建.NET Core Web应用程序---基本项目结构

    前言 随着.NET Core日益成熟, 我作为C#&.NET体系中的一份子也加入了.NET Core 这一体系中,随着不断学习, 接触到的各种框架日益庞杂,接下来我会由一个新手的角度把整个基于 ...

  7. net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解

    asp.net core环境变量详解   环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...

  8. net core体系-web应用程序-1VS2017构建一个简单的web

    使用vs2017,添加一个新项目-asp.net core web应用程序. 结构如图, wwwroot放了网站的静态资源如css.js.image文件: appsetting.json是应用程序的配 ...

  9. net core体系-web应用程序-4net core2.0大白话带你入门-1目录

    asp.net core2.0大白话带你入门 本系列包括: 1.新建asp.net core项目2.web项目目录解读3.配置访问地址4.环境变量详解5.配置文件6.日志7.DI容器8.服务的生命周期 ...

随机推荐

  1. "贪吃蛇"-css3效果

    clip  :  http://www.w3school.com.cn/cssref/pr_pos_clip.asp 姜糖水  :  http://www.cnphp6.com/archives/60 ...

  2. 003_ab http压测工具

    一. ab -r -k -c 20000 -n 25000000 https://www.uuwatch.me/abtest #ab压测工具单机最大并发为20000,可以在多台机器上执行以增大并发 y ...

  3. 使用percona-xtrabackup工具对mysql数据库的备份方案

    使用percona-xtrabackup工具对mysql数据库的备份方案 需要备份mysql的主机 172.16.155.23存放备份mysql的主机 172.16.155.22 目的:将155.23 ...

  4. fiddler 抓取 安卓模拟器 https包

    2017-12-12 16:47:45 星期二 需要材料: 1. fiddler 2. 逍遥模拟器 步骤: 1. fiddler->tool->Optiions...->connec ...

  5. 【原创】Linux基础之测试域名IP端口连通性

    一 测试域名是否可达 1 ping # ping www.baidu.comPING www.a.shifen.com (220.181.112.244) 56(84) bytes of data.6 ...

  6. [PHP]常量的一些特性

    1. define()函数如果定义了两个名称一模一样的常量,那么它将不会抛出错误,并且只有第一次的定义是生效的,再次定义并不会覆盖先前的值: define('ABC', 0); define('ABC ...

  7. Codeforces 1117G Recursive Queries [线段树]

    Codeforces 洛谷:咕咕咕 思路 设\(L_i,R_i\)为\(i\)左右第一个大于它的位置. 对于每一个询问\(l,r\),考虑区间每一个位置的贡献就是\(\min(r,R_i-1)-\ma ...

  8. 分享一份非常强势的Android面试题

    马上步入金九银十了,是时候看一些面试题去鹅厂了,接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助! ListView和RecyclerView区别 参考链接: https://blog.c ...

  9. swift 学习- 26 -- 泛型

    // 泛型 代码能够让你根据自定义的需求,编写出适用于任意类型, 灵活可重用的函数以及类型, 它能让你避免代码的重复, 用一种清晰和抽象的方式来表达代码的意图 // 泛型是 Swift 最强大的特性之 ...

  10. Windows下安装Confluence并破解汉化

    注:本文来源于<Windows下安装Confluence并破解汉化> 一.事前准备 1:JDK下载并安装:jdk-6u45-windows-i586.exe 2:MySQL JDBC连接驱 ...