web-dev-qa-db-fra.com

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

J'essaie d'appeler RoleEnvironment.GetConfigurationSetting("SOMEKEY") comme suit:

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

Ma clé ServiceConfiguration.cscfg ressemble à ceci:

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

Et je reçois cette erreur:

Détails des exceptions: System.Runtime.InteropServices.SEHException: le composant externe a levé une exception.

[SEHException (0x80004005): le composant externe a levé une exception.] RoleEnvironmentGetConfigurationSettingValueW (UInt16 *, UInt16 *, UInt32, UInt32 *) +0 Microsoft.WindowsAzure.ServiceRuntime. .WindowsAzure. , EventArgs e) dans 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 (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627

38
Kori

Vous obtiendrez l'exception SEHE si vous tentez d'accéder à RoleEnvironment si vous n'exécutez pas dans la matrice de développement ou la structure Azure. Je pense que vous exploitez votre site Web par inadvertance sous le serveur de développement asp.net, ce qui signifie que vous n'êtes pas dans le tissu de développement (j'ai confirmé que cela créerait une exception SEHE). En d'autres termes, vous avez défini votre projet de site Web en tant que projet de démarrage ou vous avez cliqué dessus avec le bouton droit de la souris et lui avez dit de s'exécuter.

Vous devez définir le projet de cloud proprement dit en tant que projet de démarrage, ce qui affichera votre site Web exécuté par défaut sur le port 81. Le projet de cloud est le projet qui a pour membres toutes les définitions de rôles. Vous pouvez consulter la barre d'URL de votre navigateur et savoir facilement si vous utilisez le serveur de développement asp.net, car vous utiliserez un numéro de port aléatoire au lieu du port 81.

Vous devez vous assurer que vous utilisez le tissu de développement ou Azure en cochant RoleEnvironment.IsAvailable. Si cela est vrai, vous pouvez appeler n'importe quoi dans RoleEnvironment. Si c'est faux, vous ne courez pas dans le tissu.

83
David Makogon

La suppression de la balise <Sites> dans le fichier ServiceDefinition.csdef pourrait constituer une solution de contournement pour vous comme ce fut le cas pour nous, mais votre site ne sera pas déployé sur Full IIS sur le cloud. Nous utilisons 1.7 du SDK.

Donc, en résumé: RoleEnvironment.IsAvailable = False avec ceci inclus dans le ServiceDefinition.csdef avec un nombre d'instances égal à 1 que je pourrais ajouter.

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

Supprimez le nœud <Sites> et déployez-le. Vous trouverez peut-être cela maintenant RoleEnvironment.IsAvailable = True.

Il existe très peu de journaux sur ce qui se passe réellement - le site Web fonctionne correctement, il n'y a aucun avertissement, à moins que vous n'ayez qu'une seule instance, pourquoi ne pas en déployer 2 et que le site fonctionne correctement.

Ceci est un problème récent et je crois que certaines modifications doivent être apportées à ce fichier msshrtmi.dll. Il pourrait enregistrer un peu plus de ce qui pourrait réellement être le problème si le RoleEnvironment n'est pas disponible.

2
Andy A.

En guise de suivi, juste au cas où quelqu'un rencontrerait à nouveau le même problème, il pourrait également arriver que, pour une raison quelconque, l'un de vos déploiements reste bloqué dans l'émulateur de calcul.

Ce qui m'est arrivé, c’est que j’avais une webrole contenant plusieurs sites Web, chacun lié à un nom d’hôte différent. Dites: localhost et test.localhost. Normalement, vous accéderez à ceux-ci à localhost: 81 et à test.localhost: 81. Pour une raison étrange cependant, un déploiement est entré dans un état étrange où il serait répertorié dans l'émulateur de calcul, sans Visual Studio le déboguer, il indiquerait "Instance de rôle détruite" ou quelque chose du genre. Ce déploiement comportait toujours la sites Web déployés dans IIS. Sans connaître le déploiement de ce buggy, j’ai accédé aux URL par défaut, c.-à-d. test.localhost: 81 qui chargerait les anciens fichiers de déploiement. Le site (ancien) fonctionnait jusqu'à ce que j'ouvre une page qui utilisait réellement la méthode RoleEnvironment.GetConfigurationSettingValue, et ce n'est qu'alors que j'ai eu cette exception. C’était vraiment frustrant de constater que ce déploiement de boggus n’avait apparemment pas atteint de point de rupture ni d’exception, mais il ressemblait exactement au site sur lequel je travaillais ..

Lorsque j'ai réalisé cela, j'ai ouvert les noms d'hôte sous le nouveau port et les pages ont fonctionné comme prévu. Une fois que j'ai supprimé ce déploiement buggy de l'émulateur de calcul, les sites Web IIS ont également été supprimés et, heureusement, les ports sont désormais disponibles pour une utilisation conforme.

1
karel_evzen

Bien que beaucoup soulignent que vous devriez utiliser la structure dev/Azure au lieu du serveur de développement asp.net, je pense qu'il est utile de mentionner que vous devez choisir le bonmodèle d'exécutionlorsque vous publiez votre application sur Azure si vous souhaitez utiliser leRoleEnvironment.

Il y a 3 modèles à partir de maintenant:

  • VM
  • Site Internet
  • Service cloud

Veuillez vous référer à: http://Azure.Microsoft.com/en-us/documentation/articles/fundamentals-application-models pour plus de détails.

Et surtout le paragraphe suivant:

Les services cloud, qui étaient le modèle d'exécution initial fourni par Azure, constituent une approche explicitement PaaS. Bien que la ligne de démarcation entre PaaS et Soit floue, les services de cloud computing diffèrent de plusieurs manières importantes Des sites Web, notamment:

  • Contrairement aux sites Web, les services en nuage vous donnent un accès administratif aux ordinateurs virtuels de votre application. Cela vous permet d'installer des logiciels arbitraires dont votre application a besoin, ce qui n'est pas possible avec les sites Web.
  • Les services cloud offrant à la fois des rôles Web et des rôles de travail, il s'agit d'un meilleur choix que les sites Web pour les applications à plusieurs niveaux qui nécessitent des ordinateurs virtuels distincts pour leur logique métier.
  • Les services en nuage fournissent des environnements de transfert et de production distincts, ce qui rend les mises à jour d'applications plus lisses que les sites Web.
  • Contrairement aux sites Web, vous pouvez utiliser des technologies réseau telles que Azure Virtual Network et Azure Connect pour connecter des ordinateurs sur site à des applications Cloud Services.
  • Les services en nuage vous permettent d'utiliser Remote Desktop pour vous connecter directement aux ordinateurs virtuels d'une application, ce qui n'est pas possible avec les sites Web.

Vous pouvez vérifier le RoleEnvironment.IsAvailable. S'il est faux, votre application ne s'exécute pas avec Azure Runtime, ce qui signifie que la variable RoleEnvironment n'est pas applicable.

0
smwikipedia

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.

0
Simen eriksen