38 votes

Pourquoi est-ce que je reçois SEHException lorsque j'appelle RoleEnvironment.GetConfigurationSettingValue ("MYKEY")?

Je suis en train d'appeler RoleEnvironment.GetConfigurationSetting("SOMEKEY") comme:

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;
}

Mon ServiceConfiguration.cscfg clé ressemble à ceci:

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

Et j'ai cette erreur:

Détails De L'Exception: System.Moment de l'exécution.InteropServices.SEHException: composant Externe a jeté une exception.

[SEHException (0x80004005): composant Externe a jeté une exception.] RoleEnvironmentGetConfigurationSettingvaluew(UInt16* , UInt16* , UInt32 , UInt32* ) +0 Microsoft.WindowsAzure.ServiceRuntime.Interne.InteropRoleManager.GetConfigurationSetting(String nom, String& ret) +92 Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue(String configurationSettingName) +67 ChargifyNET.ChargifyAzurePage.get_Chargify() dans C:\NetProjects\ChargifyDotNET\Source\Chargify.NET\ChargifyAzurePage.cs:26 Chargify.Azure._Default.Page_Load(Object sender, EventArgs e) dans C:\NetProjects\ChargifyDotNET\Source\Chargify.Azure\Default.aspx.vb:8 Système.Web.L'INTERFACE utilisateur.De contrôle.OnLoad(EventArgs e) +99 Système.Web.L'INTERFACE utilisateur.De contrôle.LoadRecursive() +50 Système.Web.L'INTERFACE utilisateur.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627

85voto

David Makogon Points 28933

Vous obtiendrez la SEHException si vous tentez d'accéder à RoleEnvironment si vous n'êtes pas en cours d'exécution dans le tissu de dev ou de tissu Azure. Je crois que vous êtes, par inadvertance, de l'exécution de votre site web, sous l'asp.net serveur de développement, ce qui signifie que vous n'êtes pas dans le tissu de dev (j'ai confirmé qu'il lancera une SEHException). En d'autres termes, vous avez à votre projet de site web comme le démarrage d'un projet, ou vous avez cliqué avec le bouton droit et il a dit à son exécution.

Vous devez définir le projet de nuage lui-même comme projet de démarrage, qui affichera alors votre site web fonctionnant sur le port 81 par défaut. Le projet de nuage est le projet qui a, comme ses membres, tous vos définitions de rôle. Vous pouvez regarder votre navigateur la barre d'adresse URL et facilement savoir si vous êtes en cours d'exécution dans le asp.net serveur de dev, parce que vous allez être sur certains numéro de port aléatoire à la place de port 81.

Vous devez vous assurer que vous êtes en cours d'exécution dans le tissu de dev ou de tissu Azure en cochant RoleEnvironment.IsAvailable. Si c'est vrai, vous êtes sûr de dire que quelque chose est en RoleEnvironment. Si c'est faux, vous n'êtes pas en cours d'exécution dans le tissu.

2voto

Andy A. Points 17

Retrait de l' <Sites> balise dans l' ServiceDefinition.csdef le fichier pourrait être une solution pour vous comme pour nous, mais votre site ne sera pas déployé à Plein IIS sur le Cloud. Nous sommes à l'aide de 1,7 du SDK.

Donc en résumé: RoleEnvironment.IsAvailable = False avec ce inclus dans l' ServiceDefinition.csdef avec un nombre d'instances de 1, je pourrais ajouter.

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

Supprimer l' <Sites> de nœud et de la déployer et vous trouverez peut-être que maintenant, RoleEnvironment.IsAvailable = True.

Il y a très peu de journaux à propos de ce qui se passe réellement - le site est en cours d'exécution fine, il n'y a pas d'avertissements à l'exception de l'habitude, vous avez seulement 1 exemple pourquoi ne pas déployer 2 et le site est en place et fonctionne bien.

C'est un problème récent et je crois qu'il doit y avoir quelques modifications faites dans cette msshrtmi.dll. Il peut se connecter à un peu plus de ce qui peut être le problème si l' RoleEnvironment n'est pas disponible.

1voto

karel_evzen Points 362

À suivre sur ce, juste au cas où quelqu'un se jette dans le même problème à nouveau, il pourrait également être le cas que pour quelque raison que ce soit l'un de vos déploiements s'est coincé dans l'émulateur de calcul.

Ce qui m'est arrivé c'est que j'avais un webrole contenant plusieurs sites, chacun étant lié à un autre nom d'hôte. Dire: localhost et de test.localhost. Normalement, vous auriez accès à localhost:81 et de test.localhost:81. Pour quelque étrange raison, cependant, un déploiement suis dans un état bizarre où il serait inscrit dans l'émulateur de calcul, sans débogage Visual Studio, il disait "le Rôle de l'Instance détruit" ou quelque chose le long de ces lignes.. Ce déploiement avait encore les sites déployés dans IIS. Je puis, sans savoir à propos de ce buggy de déploiement, accessible à l'url par défaut, c'est à dire. test.localhost:81 qui serait de charger les anciens fichiers de déploiement. Le (vieux) site travaillé jusqu'à ce que j'ai ouvert une page qui en fait RoleEnvironment.GetConfigurationSettingValue méthode, et seulement ensuite que j'ai eu cette exception. C'était vraiment frustrant que cette boggus déploiement obvioulsy n'a pas atteint l'un des points d'arrêt, ni breaked sur les exceptions, pourtant, il semblait exactement comme sur le site, j'ai travaillé sur..

Quand j'ai réalisé cela, j'ai ouvert les noms d'hôte en vertu du nouveau port, et là, les pages a fonctionné comme prévu. Une fois que j'ai enlevé ce buggy de déploiement à partir de l'émulateur de calcul les sites web IIS aussi a été supprimé et, heureusement, les ports sont maintenant disponibles pour une utilisation comme prévu..

0voto

Simen eriksen Points 316

Si vous obtenez la même erreur après avoir vérifié que vous exécutez la matrice de développement, essayez de réduire le nombre d'instances à un. Cela a réglé le problème pour moi.

Cela semble quand même bizarre que je ne puisse pas déboguer avec 2 instances.

0voto

smwikipedia Points 5491

Bien que de nombreux que vous devez exécuter avec dev/Azure tissu au lieu de la asp.net serveur de développement, je pense qu'il vaut la peine de mentionner que vous avez besoin pour choisir le bon modèle d'exécution lorsque vous publiez votre application Azure si vous souhaitez utiliser le RoleEnvironment.

Il y a 3 modèles de maintenant:

  • VM
  • Site Web
  • Service Cloud

Rendez-vous ici: http://azure.microsoft.com/en-us/documentation/articles/fundamentals-application-models pour plus de détails.

Et en particulier le paragraphe suivant:

Les Services de Cloud, qui a été le premier modèle d'exécution fournis par Azure, est explicitement PaaS approche. Alors que la ligne entre PaaS et l'hébergement web est floue, les Services de Cloud diffère à certains égards importants à partir de Sites Web, y compris les suivantes:

  • Contrairement à des Sites Web, les Services de Cloud vous donne accès administratif à votre application du VMs. Cela vous permet d'installer arbitraire des logiciels dont votre application a besoin, quelque chose qui n'est pas possible avec les Sites Web.
  • Parce que les Services de Cloud offre à la fois les rôles web et les rôles de travail, c'est un meilleur choix que des Sites Web pour des applications multi-niveau qui doivent séparer les VMs pour leur logique d'entreprise.
  • Les Services de Cloud comporte, d'une part de mise en scène et les environnements de production, faisant application des mises à jour un peu plus lisse que les Sites Web.
  • Contrairement aux Sites Web, vous pouvez utiliser la mise en réseau des technologies telles que Azure Virtual Network et d'Azur de se Connecter à crochet ordinateurs sur place de Services de Cloud computing applications.
  • Les Services de Cloud vous permet d'utiliser le Bureau à Distance pour vous connecter directement à une application du VMs, quelque chose qui n'est pas possible avec les Sites Web.

Vous pouvez vérifier l' RoleEnvironment.IsAvailable. Si elle est fausse, votre application n'est pas en cours d'exécution avec Azure de l'exécution, ce qui signifie que l' RoleEnvironment n'est pas applicable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X