我尝试将其添加到我的ServiceDefinition.csdef文件中:
<WorkerRole ...><Runtime><Environment>
<Variable name="AZURE_STORAGE_ACCOUNT">
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='AZURE_STORAGE_ACCOUNT']/@value" />
</Variable>
</Environment></Runtime></WorkerRole>
我在ServiceConfiguration.Cloud.cscfg文件中设置了配置设置:
<Role name="WorkerRole">
<ConfigurationSettings>
<Setting name="AZURE_STORAGE_ACCOUNT" value="<secret stuff>" />
</ConfigurationSettings>
</Role>
但是当我运行cspack
时出现以下错误:
CloudServices091 : The '/RoleEnvironment/CurrentInstance/Configur
ationSettings/ConfigurationSetting[@name='AZURE_STORAGE_ACCOUNT']/@value' is an
invalid xpath expression.
答案 0 :(得分:8)
您是否错过了该设置的声明?我在.csdef
中没有看到相应的元素,例如<ConfigurationSettings><Setting name="AZURE_STORAGE_ACCOUNT"/></ConfigurationSettings>
。您需要.csdef
中的一个,然后您仍然需要.cscfg
中包含该值的那个。
如果您使用的是Visual Studio,则在使用其属性视图时,它应该为您编辑这两个文件。 (只需双击该角色,然后单击以获取配置设置并添加新设置。)
答案 1 :(得分:0)
配置似乎是正确的。如果你能确保使用最新的SDK会更好。 Windows Azure SDK 1.5及更高版本中提供了xPath功能。
最诚挚的问候,
徐明。答案 2 :(得分:0)
我尝试过在博客中提到的不同选项,例如包括.cscfg和.csdef中的设置。但是,它似乎不起作用。 此外,其他Xpath查询,如
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/@id"/>
正常工作。
最后,我发现使用的变量名称不同:
在cscfg中我有:
<Setting name="WFFEPeriodicRestartTime" value="168:00:00" />
在csdef我有:
<ConfigurationSettings>
<Setting name="PeriodicRestartTime" />
</ConfigurationSettings>
.... ....
<Variable name="PeriodicRestartTime">
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='WFFEPeriodicRestartTime']/@value" />
</Variable>
将csdef更改为:
<ConfigurationSettings>
<Setting name="WFFEPeriodicRestartTime" />
</ConfigurationSettings>
.... ....
<Variable name="WFFEPeriodicRestartTime">
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='WFFEPeriodicRestartTime']/@value" />
</Variable>
现在似乎正常工作
答案 3 :(得分:0)
在这里遇到同样的问题,因为我试图通过此处提供的示例读取配置值:https://docs.microsoft.com/en-us/azure/cloud-services/cloud-services-role-config-xpath#config-setting - 在此过程中丢失了相当多的脑细胞!
诀窍是,这并不意味着您从web.config中读取配置值(这是我误读的方式),而是从cscfg文件中的Settings中读取。
使用云服务,您有1个csdef文件适用于所有云服务轮廓,但随后是每个环境的cscfg。在我的场景中,我有DEV,QA,Prod的cscfg,我需要根据环境设置不同的变量。
因此,对于OP的问题,当您尝试执行“RoleEnvironment / CurrentInstance / ConfigurationSettings ..”语句并获取无效的xpath值时,它基本上说“嘿,我找不到这个值”
如何让魔术发生:
您的csdef文件需要以下内容:
<ConfigurationSettings>
<Setting name="AZURE_STORAGE_ACCOUNT" />
</ConfigurationSettings>
您的cscfg需要:
<ConfigurationSettings>
<Setting name="AZURE_STORAGE_ACCOUNT" value="Some Secret Value" />
</ConfigurationSettings>
出于我的目的,我试图在startup.cmd文件中使用此值,因此我能够将以下内容添加到我的csdef启动任务中
<Startup>
<Task commandLine="Startup.cmd" executionContext="elevated" taskType="simple">
<Environment>
<Variable name="AZURE_STORAGE_ACCOUNT">
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='AZURE_STORAGE_ACCOUNT']/@value" />
</Variable>
</Environment>
</Task>
</Startup>
然后在我的startup.cmd中,您可以将该值引用为%% AZURE_STORAGE_ACCOUNT %%