翻译 - ASP.NET Core 基本知识 - 环境(Environments)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-6.0
ASP.NET Core 基于运行环境使用一个环境变量配置应用程序的行为。
环境
ASP.NET Core 从下列环境变量读取配置决定运行时的环境:
- DOTNET_ENVIRONMENT
- ASPNETCORE_ENVIRONMENT 当 ConfigureWebHostDefaults 被调用的时候。默认的 ASP.NET Core web 应用程序模板调用 ConfigureWebHostDefaults。ASPNETCORE_ENVIRONMENT 的值会覆盖 DOTNET_ENVIRONMENT 的值。
IHostEnvironment.EnvironmentName 可以被设置为任意值,但是下面的值是由框架本身提供的:
- Development(开发):launchSettings.json 文件在本机上设置 ASPNETCORE_ENVIRONMENT 为 Development。
- Staging(阶段)
- Production (生产):如果 DOTNET_ENVIRONMENT 和 ASPNETCORE_ENBIRONMENT 都没有设置的话,默认为 Production。
下面的代码:
- 当 ASPNETCORE_ENVIRONMENT 被设置为 Development 的时候调用了 UseDeveloperExceptionPage
- 当 ASPNETCORE_ENVIRONMENT 被设置为 Staging,Production,或者 Staging_2 时,调用了 UseExceptionHandler
- 注入 IWebHostEnvironment 到方法 Startup.Configure 中。当应用程序仅仅要求在 Startup.Configure 中使用最少的代码去区分每一个环境的时候,这种方法很有用。
- 和通过使用 ASP.NET Core 模板生成的代码是相似的
Environment Tag Helper 使用 IHostEnvironment.EnvironmentName 的值包含或者排除元素中的标记:
在 Windows 和 macOS上,环境变量和值是不区分大小写的,在 Linux 上是区分大小写的。
创建环境变量示例
本文档中使用的示例代码(sample code)是基于名称为 EnvironmentsSample 的 Razor Pages 工程。
下面的代码创建并运行名称为 EnvironmentsSample 的 web 应用程序:
当应用程序运行的时候,会有以下输出:
web.config
如何使用 web.config 设置 ASPNETCORE_ENVIRONMENT 环境变量,查看 ASP.NET Core Module 中的设置环境变量部分。
项目文件或者发布配置文件
对于在 Windows 上使用 IIS 部署:在发布配置文件(publish profile (.pubxml))或者项目文件中包括有 <EnvironmentName> 属性。这种方法会在项目发布的时候在 web.config 文件中设置环境:
<PropertyGroup> <EnvironmentName>Development</EnvironmentName> </PropertyGroup>
Per IIS Application Pool
对于设置一个在隔离的应用程序池运行(IIS 10.0 或者更新版本支持)的应用程序的 ASPNETCORE_ENVIRONMENT 环境变量,请查看 Environment Variables <environmentVariables> 主题的 AppCmd.exe command 部分。当为一个应用程序池设置 ASPNETCORE_ENVIRONMENT 环境变量时,它会覆盖系统级别的设置。
当在 IIS 中托管一个应用程序时,添加或者更改 ASPNETCORE_ENVIRONMENT 环境变量,可以使用以下的任意一种方法获取新的值:
- 执行 net stop was /y,然后执行 net start w3svc
- 重启服务器
macOS
为 macOS 设置当前环境可以在运行应用程序时执行以下命令:
ASPNETCORE_ENVIRONMENT=Staging dotnet run
或者,在运行应用程序之前使用 export 命令:
export ASPNETCORE_ENVIRONMENT=Staging
Machine-level 的环境变量在 .bashrc 或者 .bash_profile 文件中设置。使用任意的文本编辑器都可以编辑。添加下列语句:
export ASPNETCORE_ENVIRONMENT=Staging
Linux
对于 Linux 发行版,在当前会话使用 export 命令设置环境,使用 bash_profile 文件设置 machine-level 的环境设置。
在代码中设置环境
在创建主机的时候调用 UseEnvironment。查看 .NET Generic Host in ASP.NET Core。
通过环境配置
通过环境加载配置,请查看 Configuration in ASP.NET Core。
基于环境的 Startup 类和方法
注入 IWebHostEnvironment 到 Startup 类
注入 IWebHostEnvironment 到 Startup 的构造方法。这种方法在应用程序在区分只有几个环境,并且代码量很少的情况下,用来配置 Startup 是很有用的。
在下面的例子中:
- 环境存储在 _env 字段中
- _env 被用在 ConfigureServices 和 Configure 中基于应用程序的环境应用一些启动时的配置
public class Startup { public Startup(IConfiguration configuration, IWebHostEnvironment env) { Configuration = configuration; _env = env; } public IConfiguration Configuration { get; } private readonly IWebHostEnvironment _env; public void ConfigureServices(IServiceCollection services) { if (_env.IsDevelopment()) { Console.WriteLine(_env.EnvironmentName); } else if (_env.IsStaging()) { Console.WriteLine(_env.EnvironmentName); } else { Console.WriteLine("Not dev or staging"); } services.AddRazorPages(); } public void Configure(IApplicationBuilder app) { if (_env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } }
Startup 类约定
当一个 ASP.NET Core 应用程序启动时,Startup 类(Startup class )引导应用程序。应用程序可以为不同的环境定义多个 Startup 类。合适的 Startup 类会在运行时被选中。类的名称的前缀匹配了当前环境的类会优先使用。如果一个匹配的 Startup{EnvironmentName} 的类没有被发现,Startup 类会被使用。这种方法在应用程序需要区分每一个环境使用大量代码配置不同环境的启动时非常有用。一般的应用程序不会用到这种方法。
为了实现基于环境的 Startup 类,创建一个 Startup{EnvironmentName} 类和一个备用的 Startup 类:
public class StartupDevelopment { public StartupDevelopment(IConfiguration configuration) { Configuration = configuration; Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Name); } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); } public void Configure(IApplicationBuilder app) { app.UseDeveloperExceptionPage(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } } public class StartupProduction { public StartupProduction(IConfiguration configuration) { Configuration = configuration; Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Name); } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); } public void Configure(IApplicationBuilder app) { app.UseExceptionHandler("/Error"); app.UseHsts(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } } public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Name); } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } }
使用重载方法 UseStartup(IWebHostBuilder, String) 接收一个程序集名称:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) { var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName; return Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(assemblyName); }); } }
Startup 方法约定
Configure 和 ConfigureServices 方法支持特定环境版本的 Configure<EnvironmentName> 和 Configure<Environment>Services。如果匹配的 Configure<Environment>Services 或者 Configure<Environment> 方法没有被发现,ConfigureServices 或者 Configure 方法会被使用。这种方法在应用程序在配置启动时需要使用大量代码来区分每一个环境时是有用的:
public class Startup { private void StartupConfigureServices(IServiceCollection services) { services.AddRazorPages(); } public void ConfigureDevelopmentServices(IServiceCollection services) { MyTrace.TraceMessage(); StartupConfigureServices(services); } public void ConfigureStagingServices(IServiceCollection services) { MyTrace.TraceMessage(); StartupConfigureServices(services); } public void ConfigureProductionServices(IServiceCollection services) { MyTrace.TraceMessage(); StartupConfigureServices(services); } public void ConfigureServices(IServiceCollection services) { MyTrace.TraceMessage(); StartupConfigureServices(services); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { MyTrace.TraceMessage(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } public void ConfigureStaging(IApplicationBuilder app, IWebHostEnvironment env) { MyTrace.TraceMessage(); app.UseExceptionHandler("/Error"); app.UseHsts(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } } public static class MyTrace { public static void TraceMessage([CallerMemberName] string memberName = "") { Console.WriteLine($"Method: {memberName}"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端