我试图像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
答案 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种型号:
有关详细信息,请参阅此处: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
不适用。