Program文件的作用
Program.cs文件分析
Program.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();
衍生拓展#
常见疑问:#
-
为什么不把调用的WebHost.CreateDefaultBuilder() / Host.CreateDefaultBuilder()方法直接放在Main函数中,而再写一个CreatetWebHosBuilder() / CreateHostBuilder()方法包裹起来?#
答:因为是为了区分在Main函数中对生成的主机对象调用Run()的代码,比如在使用EF Core 的时候,就必须要有这种区分。
-
Program.cs文件中CreateDefaultBuilder()方法的作用?#
答:无论是WebHost还是Host,他们调用各自的CreateDefaultBuilder()方法主要是执行以下任务
- 将根目录设置为Directory.GetCurrenDirectory()方法返回的路径
- 通过命令行、前缀为ASPNETCORE_的环境变量加载主机配置
- 加载应用配置,按照appsetting.json、appsetting.{Environment}.json、入口程序集的用户机密、环境变量、命令行参数
- 配置控制台和调试输出的日志记录
- 使用ASP NET Core模块在IIS后运行,默认会继承IIS
- 包含一些拓展方法,如ConfigureAppConfiguration()拓展配置
作者:boise
出处:https://www.cnblogs.com/boise/p/17700124.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?