我有一种情况,我需要从部署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
确实显示该变量存在,也无法正常工作。
答案 0 :(得分:0)
这不是直接的,但是有一种方法:
答案 1 :(得分:0)
如果要在部署时通过配置文件(或参数)传递数据,并使用Context.CodePackageActivationContext.GetConfigurationPackageObject("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读取环境变量的权限