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。
5: string ApplicationVersion { get; }
7: }
如果需要获取一个ApplicationEnvironment对象来描述当前执行环境,我们需要使用到如下这个名为PlatformServices的对象,它的Application属性返回的就是我们所需的ApplicationEnvironment对象。因为该类型并不存在一个公共的构函数,所以我们不能直接实例化一个PlatformServices对象,不过我们可以利用Default属性得到这个单例对象。
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承载的执行环境选项。
4: Environment.SetEnvironmentVariable("ASPNETCORE_CONTENTROOT",@"c:\myapp\contentroot");
6: new WebHostBuilder()
8: .ConfigureServices(svcs => {
10: Debug.Assert(env.ApplicationName == "MyApp 11: Debug.Assert(env.EnvironmentName == "Staging 12: Debug.Assert(env.WebRootPath == @"c:\myapp\wwwroot\ 13: Debug.Assert(env.ContentRootPath == @"c:\myapp\contentroot");
15: .UseKestrel()
1: {
3: "environment" : "Staging",1)"> 4: "webRoot" : "c:\\myapp\\wwwroot",1)"> 5: "contentRoot" : "c:\\myapp\\contentroot"
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:\myapp\contentroot");
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>对象,最终将会导致设置的应用名称完全不同。
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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。