Windows Azure: как установить параметр конфигурации в качестве переменной среды?

Я попытался добавить это в свой файл 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.

Ответ 1

Вам не хватает декларации этого параметра? Я не вижу соответствующего элемента в вашем .csdef, что-то вроде <ConfigurationSettings><Setting name="AZURE_STORAGE_ACCOUNT"/></ConfigurationSettings>. Вам нужен один из них в вашем .csdef, а затем вы все равно хотите, чтобы в вашем .cscfg было включено значение.

Если вы используете Visual Studio, он должен отредактировать оба файла для вас, если вы используете его представление свойств. (Просто дважды щелкните роль, а затем нажмите, чтобы перейти к настройкам конфигурации и добавить новый.)

Ответ 2

Конфигурация кажется правильной. Было бы лучше, если вы сможете убедиться, что используете последнюю версию SDK. Функция xPath доступна в Windows Azure SDK 1.5 и более поздних версиях.

С наилучшими пожеланиями,

Ming Xu.

Ответ 3

Я пробовал различные варианты, упомянутые в блогах, например, включая настройки в обоих .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>

Кажется, что он работает правильно.