在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称。如下面的代码片段所示,一个HostingEnvironment对象承载的执行环境的描述信息体现在定义这个接口的6个属性上。ApplicationName和EnvironmentName分别代表当前应用的名称和执行环境的名称。WebRootPath和ContentRootPath是指向两个根目录的路径,前者指向的目录用于存放可供外界通过HTTP请求访问的资源,后者指向的目录存放的则是应用自身内部所需的资源。至于这个接口的ContentRootFileProvider和WebRootFileProvider属性返回的则是针对这两个目录的FileProvider对象。如下所示的HostingEnvironment类型是对IHostingEnvironment接口的默认实现。[本文已经同步到《ASP.NET Core框架揭秘》之中] 1: public interface IHostingEnvironment 2: {
3: string ApplicationName { get; set; } 4: string EnvironmentName { get; set; } 5: IFileProvider ContentRootFileProvider { get; set; }
6: string ContentRootPath { get; set; } 7: IFileProvider WebRootFileProvider { get; set; }
8: string WebRootPath { get; set; } 9: }
10:?
11: class HostingEnvironment : IHostingEnvironment 12: {
13: 14: 15: IFileProvider ContentRootFileProvider { get; set; } 16: 17: IFileProvider WebRootFileProvider { get; set; } 18: 19: } 一、ApplicationEnvironment接下来我们会对HostingEnvironment对象承载的执行环境描述信息的来源进行详细介绍,不过在此之前我们有必要来了解另一个名为ApplicationEnvironment的类型,它定义在 “Microsoft.Extensions.PlatformAbstractions”这个NuGet包中。我们从其命名也可以看出这个对象描述的也是与执行环境相关的信息,而它承载的这些信息提下在如下四个属性成员上,它们分别表示应用的名称、基路径、版本和采用的.NET Framework。 string ApplicationName { get; }
5: string ApplicationVersion { get; }
7: } 如果需要获取一个ApplicationEnvironment对象来描述当前执行环境,我们需要使用到如下这个名为PlatformServices的对象,它的Application属性返回的就是我们所需的ApplicationEnvironment对象。因为该类型并不存在一个公共的构函数,所以我们不能直接实例化一个PlatformServices对象,不过我们可以利用Default属性得到这个单例对象。 private PlatformServices();
static PlatformServices Default { get; } class Program 4: { 6: AssemblyName assemblyName = assembly.GetName(); 8:? 10: Debug.Assert(env.ApplicationName == assemblyName.Name); 12: Debug.Assert(env.RuntimeFramework.ToString() == assembly.GetCustomAttribute<TargetFrameworkAttribute>().FrameworkName); 14: } 如果我们没有对应用的名称做显式设置,当前HostingEnvironment的ApplicationName属性体现的应用名称来源于这个ApplicationEnvironment对象的同名属性。HostingEnvironment包括ApplicationName在内的四个属性(不包括WebRootFileProvider和ContentRootFileProvider属性,因为它们决定于对应ContentRootPath和WebRootPath属性)都可以通过WebHostOptions来设置。通过前面一章的介绍我们知道WebHostOptions对象是根据WebHostBuilder的采用的配置来创建的,所以我们可以利用配置的方式来决定执行环境。 二、Configuration和WebHostOptions对于通过HostingEnvironment的四个属性(ApplicationName、EnvironmentName、WebRootPath和ContentRootPath) 承载的四个与执行环境相关的设置,在WebHostOptions对象上都具有对应的属性,后者是前者的数据来源。由于WebHostOptions对象是WebHostBuilder根据它采用的配置来创建的,所以这些设置最初来源于使用的配置。值得一提的是,如果EnvironmentName属性未作显式设置,它使用的默认值为“Production”。 由于WebHostBuilder会采用环境变量作为配置来源,并且采用“ASPNETCORE_”作为环境变量过滤采用的前缀,所以我们完全可以按照如下的方式通过设置环境变量的方式来初始化由HostingEnvironment承载的执行环境选项。 2: Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT",1)">"Staging");
4: Environment.SetEnvironmentVariable("ASPNETCORE_CONTENTROOT",@"c:myappcontentroot"); 6: new WebHostBuilder() 8: .ConfigureServices(svcs => { 10: Debug.Assert(env.ApplicationName == "MyApp 11: Debug.Assert(env.EnvironmentName == "Staging 12: Debug.Assert(env.WebRootPath == @"c:myappwwwroot 13: Debug.Assert(env.ContentRootPath == @"c:myappcontentroot"); 15: .UseKestrel() 1: { 3: "environment" : "Staging",1)"> 4: "webRoot" : "c:myappwwwroot",1)"> 5: "contentRoot" : "c:myappcontentroot" new WebHostBuilder() 3: .ConfigureServices(svcs => { 5: Debug.Assert(env.ApplicationName == 6: Debug.Assert(env.EnvironmentName == 7: Debug.Assert(env.WebRootPath == 8: Debug.Assert(env.ContentRootPath == @"c:myappcontentroot"); 10: .UseKestrel() 2: 5: Debug.Assert(env.ApplicationName != 6: }) 8: .Configure(app => {}) class WebHostBuilderExtensions static IWebHostBuilder Configure(this IWebHostBuilder hostBuilder,Action<IApplicationBuilder> configureApp)
6:? 8: .UseSetting("applicationName",startupAssemblyName)
10: } 12: static IWebHostBuilder UseStartup( 13: { 15: 16: .UseSetting("ApplicationName",1)"> 17: ... 19: } 如果我们调用WebHostBuilder的UseStartup方法设置了一个启动类,那么这个类型所在的程序集名称将作为当前应用的名称。如果我们通过Configure方法并提供了一个Action<IApplicationBuilder>类型的委托对象,那么这个委托对象对应方法被定义在哪个类型中,这个类型所在的程序基名称将会作为应用名称。对于后一种情况,我们可以采用如下两种方式来提供这个Action<IApplicationBuilder>对象,最终将会导致设置的应用名称完全不同。 void Configure(IApplicationBuilder app);
6: //Configure(app=>Startup.Configure(app))
11: }) 13: .Configure(app=>Startup.Configure(app)) 15:? 17: 18: .ConfigureServices(svcs => {
20: Debug.Assert(env.ApplicationName == typeof(Startup).GetTypeInfo().Assembly.GetName().Name); 21: })
22: .UseKestrel()
23: .Configure(Startup.Configure)
24: .Build();
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – MVC 3 Webgrid – 你如何隐藏不想显示的列?
- ASP.NET存储SQL中的图像并检索Asp:Image
- .NET MVC购物车
- asp.net – 关闭/停止浏览器或选项卡关闭时的会话
- 使用LINQ生成Where的SQL语句
- asp.net如何跳转到其他文件夹下的页面
- .net – IAuthenticationFilter.OnAuthenticationChallenge
- 在asp.net gridview中如何访问RowDataBound事件中的BoundFi
- asp.net – 如何在asp中使用会话变量使用c#
- 在mvc4 asp.net中的Razor View中的模型声明
- asp.net – 实体框架不会显示存储过程
- asp.net-mvc – AsyncController如何避免使用ASP
- asp.net核心 – ASP – 启动时核心迁移EF核心SQL
- 通过ASP.NET Web API + JQuery创建一个简单的Web
- asp.net-mvc-3 – 绑定到MVC3中的DropDownList
- 处理asp.net MVC控制器构造函数中发生的异常
- asp.net-mvc – Kendo UI异步上传无法在Internet
- asp.net-mvc – Url.Action是编码参数值
- asp.net-mvc – ASP.Net MVC – 处理不好的URL参
- ASP.NET发布尝试复制不存在的文件