ASP.net Core中的多环境
分类: Asp.net Core入门 ◆ 标签: #Asp.Net core基础 #基础 #Web ◆ 发布于: 2023-06-04 20:28:35

我们这里讲的环境指的是ASP.net Core
应用运行的runtime环境。这些环境您可以自定义环境名称,并根据这些环境来设置不同的设置,但是有三个环境以及用来命名的环境的名称是ASP.net Core
定义的:
Development
: 开发环境Staging
: 预发布环境Produciton
: 产线环境
ASP.net Core
生成的程序模板,也会根据这三个环境设定一些仅仅有该环境才有的特性,例如:
- 在
Development
开发环境下,启用中间件UseDeveloperExceptionPage
- 在
预发布环境
和产线环境,启用中间件UseExceptionHandler
注意在Startup
类中的Configure
方法可以注入IWebHostEnvironment
实例,用于环境的判断。也可以通过构造函数注入。
例如:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2")) { app.UseExceptionHandler("/Error"); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); }
使用Environment Tag Help
<environment include="Development"> <div>The effective tag is: <environment include="Development"></div> </environment> <environment exclude="Development"> <div>The effective tag is: <environment exclude="Development"></div> </environment> <environment include="Staging,Development,Staging_2"> <div> The effective tag is: <environment include="Staging,Development,Staging_2"> </div> </environment>
设定环境
通过环境变量
一般情况是通过环境变量来设置环境:
- ASPNETCORE_ENVIRONMENT
开发模式和launchSettings.json
当且仅当应用为开发模式,而且是在本地,dotnet可以使用Properties\launchSettings.json
来设置环境变量。例如:
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:64645", "sslPort": 44366 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "EnvironmentsSample": { "commandName": "Project", "launchBrowser": true, "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
Startup
中使用环境
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
类可以定义多个环境
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(); }); } }
根据环境定义多个Startup
类。
需要注意在Programe
中初始化用程序集:
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
类中的多环境方法
ASP.net core
中的startup类两个方法支持多个环境命名:
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}"); } }