2016-11-11 120 views
1

发展正如本文所述,当:https://azure.microsoft.com/en-us/blog/windows-azure-web-sites-how-application-strings-and-connection-strings-work/,Azure的Web应用程序/ Web站点/网上工作可以从环境变量,而不是他们的app.config配置设置(的appSettings,的connectionString)/ web.config中。配置Azure网站/工作应用程序设置本地

例如,如果存在名为“APPSETTING_appSettingKey”环境变量,它将从app.config中/ web.config中覆盖以下设置:

<appSettings> 
    <add key="appSettingKey" value="defaultValue" /> 
</appSettings> 

一旦应用程序部署在Azure中也能正常工作,但我想在本地测试时使用相同的方法。

我尝试在本地命令行来模拟这种:

ConfigurationManager.AppSettings["appSettingKey"] 

当在Azure上运行,它读出“overridedValue”为:

> set APPSETTING_appSettingKey=overridedValue 
> MyWebJob.exe 

的Web作业使用访问该设置预期的,但在本地它从app.config文件读取值“defaultValue”。

我应该想到这个工作,或者这只是一个Azure的环境下实现的?

我能明显创造超过ConfigurationManager中模仿这种抽象,但调用需要一个连接字符串而不是一个连接字符串代码时,这是行不通的。另外,我想使用相同的方法,而不考虑环境来简化设置的管理。

有3个原因,我需要这样的:

1)我不喜欢部署到生产,它引用连接字符串等的研究与开发环境web.config文件的想法,是因为有一个风险可能导致开发设置(在web.config中)用于生产(生产Web应用程序连接到开发数据库等)的错误,例如,如果环境变量命名不正确(在web.config中重命名设置后但忘了在环境变量)

2)我想每个开发者都有自己的独立云资源建立开发环境将其重命名(存储艾科不,数据库...)。目前,每个人都必须手动编辑.config文件以引用正确的资源,并且在签入或合并对这些文件的更改时要小心。

3)解决方案可以有需要复制相同的设置(主要的Web应用程序,网站工作,集成测试项目,...)多个项目。这导致了很多工作来确保更新的设置跨所有文件进行复制。如果有,没有任何实际配置的环境无关的config文件

这将被简化,每个开发人员会配置一组环境变量的一次,并且能够使用他们的解决方案的所有部分。

+0

你可以试试'CloudConfigurationManager'? – Thomas

+0

在Azure网站/ Web作业下运行时,ConfigurationManager已经实现了类似于CloudConfigurationManager的行为。我正在寻找的是一种在本地具有相同行为的方式(如果存在,覆盖环境变量的web.config设置)。我将编辑这个问题来解释为什么我需要这个。 – ckarras

+0

@ckarras我认为你遇到的一个问题是,当你定义一个本地使用的应用程序设置时,那么该应用程序设置(这可能是一个秘密)被部署到Azure,正如你所说,你不'不想要。您可能会发现使用web.config转换在部署之前从配置文件中删除这些值会很有帮助。对于webjobs(或任何具有app.config的项目),您需要使用SlowCheetah nuget包https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms。 – Howiecamp

回答

-1

如果你想测试与将在Azure的门户网站的AppSettings /连接字符串中使用的的应用价值。我会推荐使用HostingEnvironment.IsDevelopmentEnvironment。为确保它能正常工作,请将<compilation debug="true" targetFramework="4.5.2" />更改为<compilation debug="false" targetFramework="4.5.2" />。如果(HostingEnvironment.IsDevelopmentEnvironment == false)在Azure门户中使用相同的值设置值。我有一个简单的项目尝试,希望它有助于:

 public ActionResult Index() 
     { 
      if (HostingEnvironment.IsDevelopmentEnvironment == true) 
      { 
       ViewBag.Message = "Is development."; 
      } 
      else 
      { 
       ViewBag.Message = "Azure environment."; 
      } 
      return View(); 

     } 

下面是结果:

enter image description here

+0

题外话,这根本不回答我的问题。无论IsDevelopmentEnvironment的值如何,我都会得到相同的行为:app.config/web.config中指定的appSettings不会被APPSETTING_settingName环境变量中指定的值覆盖。 – ckarras

2

是,环境变量的这一特殊转变为配置值是通过做组件,它特定于Azure WebApps,并且不会在本地运行。

通常情况下,人们对本地产生的行为很满意 - 本地通常是从配置设置读取的,但在Azure中,您正在通过应用设置门户网站刀片配置的安全设置进行读取(因此, t在你的源代码中)。如果你愿意,你可以写一个抽象概念,例如, WebJobs SDK实际上在内部执行此操作(代码here)。

+0

我认为OP的问题之一是,如果他定义了本地使用的应用程序设置,那么应用程序设置(可能是个秘密)将部署到Azure。我认为OP需要web.config转换,或者更专门针对webjobs SlowCheetah nuget包https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms,它允许转换非web.config文件。 – Howiecamp

相关问题