加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?

发布时间:2020-12-16 09:08:03 所属栏目:asp.Net 来源:网络整理
导读:HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称。如下面的代码片段所示,一个HostingEnvironment对象承载的执行环境的描述信息体现在定义这个接口的6个属性上。 ApplicationName 和

HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称。如下面的代码片段所示,一个HostingEnvironment对象承载的执行环境的描述信息体现在定义这个接口的6个属性上。ApplicationNameEnvironmentName分别代表当前应用的名称和执行环境的名称。WebRootPathContentRootPath是指向两个根目录的路径,前者指向的目录用于存放可供外界通过HTTP请求访问的资源,后者指向的目录存放的则是应用自身内部所需的资源。至于这个接口的ContentRootFileProviderWebRootFileProvider属性返回的则是针对这两个目录的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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读