Program.cs文件分析

Program.cs文件是至关重要的一个文件,它包含应用程序启动的代码,还可以配置所需要的服务和应用管道的中间件。

需要掌握:

  • 6.0版本前后生成的Program.cs文件的区别
  • Program.cs文件的作用
  • Startup.cs文件的作用

版本注意:

在6.0版本之前(不含6.0)

6.0版本之前,在使用VS创建Web应用程序框架时,会生成Program.cs和**Startup.cs **2个类文件

Program.cs:

用于创建和运行主机。

该类包含2个方法:

  • 一个Main方法:是整个应用的入口方法,调用构建主机的静态方法,然后构建并运行。
  • 一个静态的构建主机的方法:用于配置主机服务,在3.0版本之前使用CreateWebHostBuilder()的方法用于构建WebHost,3.0至5.0版本使用CreateHostBuilder()构建通用主机Host。2个方法的区别以及WebHost和Host的区别请参考主机

2.1版本


public class Program
{
public static void Main(string[] args)
{
// 获取并创建主机实例并运行起来 CreateWebHostBuilder(args).Build().Run();
} /// <summary>
/// 生成Web应用主机
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
// 反射调用Startup类
.UseStartup<Startup>()
// 使用Kestrel作为服务器并集成到IIS
.UseKestrel()
.UseIISIntegration()
);
}

3.1版本

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
/// <summary>
/// 生成通用主机
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
// 虽然使用的是Host主机,但是同样也要配置WebHost,原因是需要告知web的默认配置
// 大白话就是,需要告诉主机,你的web应用需要那些配置服务,就是指向Startup文件
// 用于托管Web应用程序的默认值配置
.ConfigureWebHostDefaults(Builder =>
{
Builder.UseStartup<Startup>();
});
}

StartUp.cs 类:

用于配置主机启动的时候,所需要的服务以及管道中间件。包含3个方法

  • 一个构造函数:可以提供一些属性给ConfigureServices()和Configure()使用
  • 一个ConfigureServices()方法:返回IServiceProvider的用于配置主机所需要的服务。
  • 一个无返回值的Configure()方法:用于配置管道中间件。

6.0及以后版本(目前是7.0)

6.0版本之后,微软使用最小托管模型来生成应用,使用最小托管模型仅仅4句代码就能创造一个NetCore应用

特点:

  • Program.cs和Startup.cs文件一起合并到Program.cs文件中(至于为什么这么做,微软给出的解释是为了降低学习成本)
  • Startup.cs中Configure()和ConfigureServices()方法不再使用,当然6.0版本是向下兼容的,所以还是可以使用Startup.cs文件来配置服务的。
  • 使用顶级语句最大程度减少应用代码
  • 使用全局using语句

最小托管模型:

请参考官方文档

// 得到应用构造器:WebApplicationBuilder
var builder = WebApplication.CreateBuilder(args);
// 配置日志
builder.Logging.AddLog4Net("ConfigFile/log4net.config");
// 得到应用:WebApplication
var app = builder.Build();
// 配置中间件
app.UseStaticFiles();
// 运行主机
app.Run();

衍生拓展

常见疑问:

  1. 为什么不把调用的WebHost.CreateDefaultBuilder() / Host.CreateDefaultBuilder()方法直接放在Main函数中,而再写一个CreatetWebHosBuilder() / CreateHostBuilder()方法包裹起来?

    答:因为是为了区分在Main函数中对生成的主机对象调用Run()的代码,比如在使用EF Core 的时候,就必须要有这种区分。

  2. Program.cs文件中CreateDefaultBuilder()方法的作用?

    答:无论是WebHost还是Host,他们调用各自的CreateDefaultBuilder()方法主要是执行以下任务

    1. 将根目录设置为Directory.GetCurrenDirectory()方法返回的路径
    2. 通过命令行、前缀为ASPNETCORE_的环境变量加载主机配置
    3. 加载应用配置,按照appsetting.json、appsetting.{Environment}.json、入口程序集的用户机密、环境变量、命令行参数
    4. 配置控制台和调试输出的日志记录
    5. 使用ASP NET Core模块在IIS后运行,默认会继承IIS
    6. 包含一些拓展方法,如ConfigureAppConfiguration()拓展配置

Program文件的作用的更多相关文章

  1. VS Build目录下各文件的作用

    VS2010中各种类型文件的作用: .sln 相当于VC6中 .dsw    .vcxproj 相当于VC6中 .dsp    .suo 相当于VC6中 .ncb    .vcxproj.filter ...

  2. VC++6.0中各种文件的作用

    VC++ 6.0是一款很经典的C/C++开发工具,虽然是1998年的东西了,但是现在使用依然很广!在用它开发的时候,会发现在建立的工程的文件夹里面,有很多文件,各种后缀名.在这里呢,我主要说一下各个文 ...

  3. ascx aspx ashx asmx 文件的作用

    ascx aspx ashx asmx 文件的作用 ascx: Ascx 是给予Web的用户控件(UserControl),一般是用来重用的,不能直接被访问只能插入aspx页面呈现.头部文件<% ...

  4. C 语言 .h文件的作用

    C语言头文件的作用 最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的 ...

  5. host文件的作用和介绍

    在Window系统中有个Hosts文件(没有后缀名)在Windows98系统下该文件在Windows目录,在Windows2000/XP系统中位于C:\Winnt\System32\Drivers\E ...

  6. .h头文件和.c文件的作用和区别

    .h头文件和.c文件的作用和区别 在小工程中,.h的作用没有得到充分的使用,在大工程中才能充分体现出.h文件的作用. .h和.c文件都是代码.头文件好处有: 一:头文件便于共享,只需要添加一句“inc ...

  7. 【学习总结】Info.plist和pch文件的作用

      Info.plist   建立一个工程后,会在Supporting files文件夹下看到一个“Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 项目中其他Plis ...

  8. SQL日志文件的作用

    服务器意外关闭造成的损失.服务器意外关闭造成的损失.解决数据一致性问题.数据库时点恢复的问题,这四个常见的问题,SQL Server数据库管理员,可以通过了解数据日志文件,轻松排除故障. 当系统出现故 ...

  9. 14.8.2 Role of the .frm File for InnoDB Tables InnoDB 表得到 .frm文件的作用

    14.8.2 Role of the .frm File for InnoDB Tables InnoDB 表得到 .frm文件的作用 Vsftp:/data01/mysql/zjzc# ls -lt ...

  10. python中__init__.py文件的作用

    问题 在执行models.py时,报ImportError:No module named transwarp.db的错误,但明明transwarp下就有db.py文件,路径也没有错误.真是想不通.后 ...

随机推荐

  1. AtCoder Beginner Contest 187 题解

    A - Large Digits 按要求求出两个数的每位之和,进行比较即可. 时间复杂度 \(\mathcal{O}(\log(AB))\). B - Gentle Pairs 枚举所有点对求斜率. ...

  2. Nginx(2)---搭建一个静态web服务

    1.配置文件语法及参数说明:nginx.conf worker_processes 1; #工作进程多少个 events { worker_connections 1024; #连接数 } http ...

  3. 【调试】kdump原理及其使用方法

    kdump机制 简介 Kdump是在系统崩溃.死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的时候产生的cras ...

  4. canvas验证码 uni-app/小程序

    1 <template> 2 <view class="logo-wrapper"> 3 <view class="logo-img&quo ...

  5. springboot+dubbo+myBatis实现微服务集成

    springboot+dubbo+myBatis实现微服务集成 代码下载:https://download.csdn.net/download/typ1805/10485048 微服务架构成了当下的技 ...

  6. 【Qt】开源一键代码开光神器,一行代码给你的项目施加祝福,减少Bug

    年底啦,没什么项目,想摸鱼划水没见到什么好玩的东西,看到有人分享这个,直接做个库来玩下,之后说不定会嵌到公司的项目里面去.... 效果如下,佛光普照! 输入也只需要一行命令 magic_spells: ...

  7. macOX常用快捷键(结尾有彩蛋)

    macOX的快捷键与windows10有所不同,了解了以后会更加提高我们的工作效率. Mac中主要有四个修饰键,分别是Command,Control,Option和Shift. 一.基本的快捷键: C ...

  8. 人人都会Kubernetes(二):使用KRM实现快速部署服务,并且通过域名发布

    1. 上节回顾 上一小节<人人都会Kubernetes(一):告别手写K8s yaml,运维效率提升500%>介绍了KRM的一些常用功能,并且使用KRM的DEMO环境,无需安装就可以很方便 ...

  9. OpenShift image registry 概述

    0. 前言 docker 镜像管理之 overlay2 最佳实践 中介绍了 image 的底层逻辑联合文件系统和分层结构. image 存储在 registry 中,对于不同平台使用 registry ...

  10. /etc/profile,/etc/bashrc,~/.profile,~/.bashrc 的区别及使用

    转载请注明出处: /etc/profile  为系统的全局环境变量设置,此文件为系统的每个用户设置环境信息    /etc/bashrc 为每一个运行bash shell的用户执行此文件.当bash ...