为什么在调用RoleEnvironment.GetConfigurationSettingValue(“MYKEY”)时收到SEHException?

我试图调用RoleEnvironment.GetConfigurationSetting("SOMEKEY")像这样:

 public partial class AzureBasePage : System.Web.UI.Page { protected ChargifyConnect Chargify { get { if (this._chargify == null) { this._chargify = new ChargifyConnect(); this._chargify.apiKey = RoleEnvironment.GetConfigurationSettingValue("CHARGIFY_API_KEY"); } return this._chargify; } } private ChargifyConnect _chargify = null; } 

我的ServiceConfiguration.cscfg键看起来像这样:

 <Setting name="CHARGIFY_API_KEY" value="AbCdEfGhIjKlMnOp" /> 

我得到这个错误:

exception详细信息:System.Runtime.InteropServices.SEHException:外部组件已引发exception。

[SEHException(0x80004005):外部组件已引发exception。] RoleEnvironmentGetConfigurationSettingValueW(UInt16 *,UInt16 *,UInt32,UInt32 *)+0 Microsoft.WindowsAzure.ServiceRuntime.Internal.InteropRoleManager.GetConfigurationSetting(String name,String&ret)+92 Microsoft在C:\ NetProjects \ ChargifyDotNET \ Source \ Chargify.NET \ ChargifyAzurePage.cs中:+27 ChargifyNET.ChargifyAzurePage.get_Chargify() ,EventArgs e)在C:\ NetProjects \ ChargifyDotNET \ Source \ Chargify.Azure \ Default.aspx.vb:8 System.Web.UI.Control.OnLoad(EventArgs e)+99 System.Web.UI.Control.LoadRecursive )+50 System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+627

如果您未在开发结构或Azure结构中运行,则尝试访问RoleEnvironment时,将会得到SEHException。 我相信你不小心在asp.net开发服务器下运行你的网站,这意味着你不在开发结构(我已经证实,这将抛出一个SEHException)。 换句话说,你已经把你的网站项目设置为启动项目,或者你已经右键单击它并让它运行。

您必须将云项目本身设置为启动项目,默认情况下会显示您的网站在端口81上运行。 云项目是作为其成员拥有所有angular色定义的项目。 你可以看看你的浏览器的url栏,并很容易地告诉你是否在asp.net开发服务器上运行,因为你将在一些随机的端口号,而不是端口81。

您应该通过检查RoleEnvironment.IsAvailable来确保您在开发结构或Azure结构中运行。 如果这是真的,你可以安全地调用RoleEnvironment中的任何东西。 如果它是错误的,你没有在结构中运行。

删除ServiceDefinition.csdef文件中的<Sites>标记对于您来说可能是一种替代方法,但是您的网站将不会部署到Cloud上的完整IIS。 我们正在使用SDK的1.7。

所以总结: RoleEnvironment.IsAvailable = False ,包含在ServiceDefinition.csdef ,实例数为1,我可能会添加。

 <Sites> <Site name="Blah"> <Bindings> <Binding name="Endpoint1" endpointName="Http" /> <Binding name="Endpoint1" endpointName="Https" /> </Bindings> </Site> </Sites> 

删除<Sites>节点并部署,现在可能会发现RoleEnvironment.IsAvailable = True

几乎没有什么实际发生的日志 – 网站运行良好,没有任何警告,除了通常情况下,你只有1个实例,为什么不部署2,网站运行良好。

这是一个最近的问题,我相信这个msshrtmi.dll中必须做一些修改。 如果RoleEnvironment不可用,它可能会logging更多的实际问题。

为了跟上这一点,为了防止有人再次遇到相同的问题,也可能出于某种原因,您的某个部署陷入了计算模拟器。

发生在我身上的事情是我有一个包含多个网站的webrole,每个网站绑定到一个不同的主机名。 说:localhost和test.localhost。 通常情况下,你可以在localhost:81和test.localhost:81上访问它们。 但是,出于某种奇怪的原因,一个部署进入了一个奇怪的状态,它将在计算模拟器中列出,没有Visual Studiodebugging它,它会说“angular色实例被摧毁”或沿着这些线路。这个部署仍然有在IIS中部署的网站。 然后,我不知道这个错误的部署,访问默认的url,即。 test.localhost:81这将加载旧的部署文件。 (旧)网站一直工作,直到我打开一个实际使用RoleEnvironment.GetConfigurationSettingValue方法的页面,然后才得到该exception。 这真是令人沮丧,因为这种笨拙的部署显然没有打破任何断点,也没有打破例外,但它看起来完全是我一直在努力的网站..

当我意识到这一点时,我打开了新的端口下的主机名,那里的页面按预期工作。 一旦我从计算模拟器中删除了这个错误部署,IIS网站也被删除了,幸好这些端口现在可以按预期的方式使用了。

如果在确定运行开发结构之后得到相同的错误,请尝试将实例数减less到一个。 这为我修好了。

不过,似乎很奇怪,我不能用2个实例debugging。

尽pipe许多人指出,应该使用dev / Azure结构而不是asp.net开发服务器运行,但是我认为值得一提的是,如果要使用RoleEnvironment将应用程序发布到Azure,则需要select正确的执行模型

现在有三种模式:

  • VM
  • 网站
  • 云服务

请参考这里: http : //azure.microsoft.com/en-us/documentation/articles/fundamentals-application-models了解更多详情。

特别是以下段落:

云服务是Azure提供的最初的执行模式,是一种明确的PaaS方法。 虽然PaaS和虚拟主机之间的界限很模糊,但云服务与网站有一些重要的不同之处,包括:

  • 与网站不同,云服务为您提供对应用程序虚拟机的pipe理访问权限。 这使您可以安装应用程序所需的任意软件,这是网站无法实现的。
  • 由于云服务同时提供了Webangular色和工作者angular色,因此对于需要单独的虚拟机作为业务逻辑的多层应用程序来说,这是一个比Web站点更好的select。
  • 云服务提供单独的登台和生产环境,使应用程序更新比网站更平滑。
  • 与网站不同,您可以使用networking技术(如Azure虚拟networking和Azure Connect)将本地计算机挂接到云服务应用程序。
  • 云服务允许您使用远程桌面直接连接到应用程序的虚拟机,这是网站无法实现的。

您可以检查RoleEnvironment.IsAvailable 。 如果它是错误的,您的应用程序不与Azure运行时一起运行,这意味着RoleEnvironment不适用。