Не удается получить доступ к RoleEnviroment при запуске нескольких сайтов в облачной службе.

У меня есть существующее решение, которое использует настройки из RoleEnviroment как в обработчиках WebRole.OnStart, так и в Global.asax Application_Start. (Это работает хорошо в течение нескольких месяцев)

Все это отлично работает, когда у меня есть только один сайт внутри моей роли:

<WebRole name="WebRole" vmsize="ExtraSmall">
    <Runtime executionContext="elevated" />
    <Sites>
      <Site name="Web1" physicalDirectory="..\..\..\Web1\">
        <Bindings>
          <Binding name="HTTP" endpointName="Public HTTP" hostHeader="web1.com" />
        </Bindings>
      </Site>
    </Sites>

Однако, когда я добавляю свой второй сайт, ни один сайт не может получить доступ к RoleEnviroment??

<WebRole name="WebRole" vmsize="ExtraSmall">
    <Runtime executionContext="elevated" />
    <Sites>
      <Site name="Web1" physicalDirectory="..\..\..\Web1\">
        <Bindings>
          <Binding name="HTTP" endpointName="Public HTTP" hostHeader="web1.com" />
        </Bindings>
      </Site>
      <Site name="Web2" physicalDirectory="..\..\..\Web2\">
        <Bindings>
          <Binding name="HTTP" endpointName="Public HTTP" hostHeader="web2.com" />
        </Bindings>
      </Site>
    </Sites>

Я протестировал это в локальном эмуляторе Azure (полном), и он отлично работает, но при развертывании в реальной веб-роли он выдает:

[SEHException (0x80004005): External component has thrown an exception.]
   RdGetApplicationConfigurationSetting(UInt16* , UInt16** ) +0
   RoleEnvironmentGetConfigurationSettingValueW(UInt16* pszName, UInt16* pszDest, UInt64 cchDest, UInt64* pcchRequiredDestSize) +73
   Microsoft.WindowsAzure.ServiceRuntime.Internal.InteropRoleManager.GetConfigurationSetting(String name, String& ret) +133
   Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue(String configurationSettingName) +109
   Web1.Installer.Install(IWindsorContainer container, IConfigurationStore store) in c:\projects\Webs\Web1\Installer.cs:21

Я проверил, что настройка, к которой я пытаюсь получить доступ, существует. Когда я удаляю второй сайт, он работает нормально. Когда я удаляю первый сайт, он также работает нормально. Мне кажется, что есть проблема с Azure, предоставляющей доступ к RoleEnviroment для веб-ролей в нескольких экземплярах.


person James    schedule 02.09.2014    source источник
comment
Похоже, что это работает только в эмуляторе, потому что эмулятор (даже при работе в полном режиме) неправильно реплицирует настройку Azure для многосайтовых систем. В Azure, несмотря на то, что RoleEntryPoint запускает процесс, отдельный от первого размещенного экземпляра IIS, размещенный экземпляр IIS w3wp.exe может получить доступ к RoleEnviroment (deployment24(303).Web1_IN_0). Второй w3wp.exe не может. Однако при использовании эмулятора оба сайта запускаются в одной и той же среде RoleEnviroment. Это означает, что я не могу отладить это локально и застряну при развертывании в отдельные облачные службы или изменении моей конфигурации :(   -  person James    schedule 03.09.2014


Ответы (1)


Итак, после работы над этим почти 2 дня. Проблема оказалась в несоответствии сборок версий Azure SDK в проектах.

На старом сайте был Azure SDK 2.4, а на более новом — SDK 2.3 по какой-то причине. Это означало, что RoleEnvironment не удалось найти, когда было развернуто два сайта (обе версии сборки).

Я предполагаю, что это связано с тем, что они по-разному ищут RoleEnvironment или конфликтуют в том, как они получают к нему доступ.

Я читал, что это может быть связано с переменными среды «Rd», которые могут привести к тому, что RoleEnvironment будет IsAvailable = false.

Итак, ребята: Если вы столкнулись с этой проблемой, убедитесь, что версии сборки Azure SDK синхронизированы!

person James    schedule 03.09.2014