从服务结构环境xml文件访问环境变量值

时间:2018-06-26 18:17:13

标签: azure-service-fabric

我有一种情况,我需要从部署Service Fabric应用程序的计算机上读取环境变量。

更具体地说,在我的cloud.xml(环境文件)中,我希望StorageConnectionString使用由其他外部工具在计算机上设置的环境变量之一的值。

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric">
    <Parameters>
        <Parameter Name="StorageConnectionString" Value="%ENVVARIABLE%" />
    </Parameters>
</Application>

以上有效吗?即使我在cmd提示符下运行SET确实显示该变量存在,也无法正常工作。

2 个答案:

答案 0 :(得分:0)

这不是直接的,但是有一种方法:

  1. 指定setup entry point(新的可执行文件或脚本)以读取环境变量并将其写入应用程序的work directory中的文件中。
  2. 出现主入口点时,从工作目录中读取文件。

答案 1 :(得分:0)

如果要在部署时通过配置文件(或参数)传递数据,并使用Context.CodePackageActivationContext.GetConfigurationPackage‌​Object("Config")通过代码访问数据,则正确的方法应该是使用<Parameter Name="StorageConnectionString" Value="[ENVVARIABLE]" />(请注意,它受[]约束) ),并具有一个名为ENVVARIABLE的变量的配置文件,并将替代设置设置为您的服务。您不需要设置环境变量,环境变量是另一回事。

请查看this SO question,查看是否可以解决问题。

如果您的计划是要在计算机中设置环境变量,那么很遗憾,SF不支持使用%ENVVARIABLE%之类的令牌来替换环境变量。

  

即使在cmd提示符下运行SET确实表明该变量存在。

另一个更改环境变量的进程,如果仅使用默认设置,它将设置自己的进程环境变量,以供其他进程使用,它必须在Machine或User范围内更新环境变量(假设它们在同一用户上运行),这就是为什么您无法从运行SET variablename

的命令中看到

...

假设变量设置正确,并且它是机器范围的变量...

在启动过程之前设置环境变量时,建议您设置一个EntryPoint脚本在启动时进行设置,就像对来宾可执行文件一样。

请参阅NodeJs示例here

您也许也可以按照Loek的建议写文件并从您的应用程序中读取,但是我认为这太麻烦了。

如果环境变量是在过程开始后设置的,或者如果以后更改,则应该直接从应用程序中获取它,您可以使用:

System.Environment.GetEnvironmentVariable(variableName,EnvironmentVariableTarget.Machine);

然后您通过config传递变量名。

在两种情况下,您的用户\进程都必须具有从Machine Scope读取环境变量的权限