在Cloud Service中运行多个站点时无法访问RoleEnviroment

时间:2014-09-02 13:48:25

标签: azure azure-web-roles azure-cloud-services azure-role-environment

我有一个现有的解决方案,它在WebRole.OnStart和Global.asax Application_Start处理程序中使用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>
    </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仿真器(完整版)中对此进行了测试,并且工作正常,但是当部署到实际的Web角色时,它会抛出:

[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存在一个问题,即在多个实例中为Web角色提供对RoleEnviroment的访问。

1 个答案:

答案 0 :(得分:0)

好的,所以经过近2天的工作。该问题证明是项目上的Azure SDK版本程序集不匹配。

旧网站有Azure SDK 2.4,由于某些原因,较新的网站有SDK 2.3,这意味着当部署了两个网站(两个版本的程序集)时无法找到RoleEnvironment。

我认为这是因为他们以不同的方式寻找RoleEnvironment,或者他们如何访问它是相互矛盾的。

我读过这可能与'Rd'环境变量有关,可能导致RoleEnvironment为IsAvailable = false。

所以小伙伴:如果遇到此问题,请检查您的Azure SDK程序集版本是否同步!