调用RoleEnvironment.GetConfigurationSettingValue(“MYKEY”)时为什么会出现SEHException?

时间:2010-06-02 13:11:21

标签: c# azure

我试图像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" />

我收到了这个错误:

  

异常详细信息:System.Runtime.InteropServices.SEHException:外部组件引发了异常。

     

[SEHException(0x80004005):外部组件抛出异常。]      RoleEnvironmentGetConfigurationSettingValueW(UInt16 *,UInt16 *,UInt32,UInt32 *)+ 0      Microsoft.WindowsAzure.ServiceRuntime.Internal.InteropRoleManager.GetConfigurationSetting(String name,String&amp; ret)+92      Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue(String configurationSettingName)+67      C:\ NetProjects \ ChargifyDotNET \ Source \ Chargify.NET \ ChargifyAzurePage.cs中的ChargifyNET.ChargifyAzurePage.get_Chargify():26      C:\ NetProjects \ ChargifyDotNET \ Source \ Chargify.Azure \ Default.aspx.vb中的Chargify.Azure._Default.Page_Load(Object sender,EventArgs e):8      System.Web.UI.Control.OnLoad(EventArgs e)+99      System.Web.UI.Control.LoadRecursive()+50      System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+627

5 个答案:

答案 0 :(得分:83)

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

您必须将云项目本身设置为启动项目,然后默认情况下将显示您的网站在端口81上运行。云项目是作为其成员的所有角色定义的项目。您可以查看浏览器的URL栏,轻松判断您是否在asp.net dev服务器上运行,因为您将使用某个随机端口号而不是端口81.

您应该通过选中RoleEnvironment.IsAvailable确保您在开发结构或Azure结构中运行。如果这是真的,你可以安全地在RoleEnvironment中调用任何东西。如果它是假的,你就不会在结构中运行。

答案 1 :(得分:2)

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

总而言之: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不可用,它可以记录实际上可能存在的问题。

答案 2 :(得分:1)

为了跟进这一点,以防万一有人再次遇到同样的问题,也可能是因为某种原因导致你的某个部署卡在了计算机模拟器中。

我发生的事情是我有一个包含多个网站的webrole,每个网站都绑定了不同的主机名。说:localhost和test.localhost。通常,您可以在localhost:81和test.localhost:81访问它们。但是出于一些奇怪的原因,一个部署进入了一个奇怪的状态,它将被列在计算模拟器中,没有Visual Studio调试它,它会说“角色实例被破坏”或者沿着这些线路的东西。这个部署仍然有在IIS中部署的网站。然后,我不知道这个错误的部署,访问了默认的URL,即。 test.localhost:81会加载旧的部署文件。 (旧)站点一直工作,直到我打开一个实际使用RoleEnvironment.GetConfigurationSettingValue方法的页面,然后才得到该异常。这真是令人沮丧,因为这个boggus部署显然没有遇到任何断点,也没有突破异常,但它看起来就像我一直在努力的网站..

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

答案 3 :(得分:0)

如果在确保运行开发结构后遇到相同的错误,请尝试将实例数减少为1。这为我解决了。

但是,似乎很奇怪我无法使用2个实例进行调试。

答案 4 :(得分:0)

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

截至目前已有3种型号:

  • VM
  • 网站
  • Cloud Service

有关详细信息,请参阅此处:http://azure.microsoft.com/en-us/documentation/articles/fundamentals-application-models

特别是以下段落:

  

云服务,这是由提供的初始执行模型   Azure,是一种明确的PaaS方法。虽然PaaS和。之间的界限   网络托管模糊,云服务在某些重要方面有所不同   来自网站,包括以下内容:

     
      
  • 与网站不同,云服务为您提供对应用程序虚拟机的管理访问权限。这使您可以安装应用程序所需的任意软件,这是网站无法实现的。
  •   
  • 由于Cloud Services同时提供Web角色和辅助角色,因此对于需要为其业务逻辑使用单独VM的多层应用程序而言,它是比Web站点更好的选择。
  •   
  • 云服务提供单独的登台和生产环境,使应用程序更新比网站更顺畅。
  •   
  • 与网站不同,您可以使用Azure虚拟网络和Azure Connect等网络技术将本地计算机连接到云服务应用程序。
  •   
  • 云服务允许您使用远程桌面直接连接到应用程序的虚拟机,这是网站无法实现的。
  •   

您可以查看RoleEnvironment.IsAvailable。如果为false,则表示您的应用程序未运行Azure运行时,这意味着RoleEnvironment不适用。