Почему я получаю SEHException при вызове функции RoleEnvironment.GetConfigurationSettingValue («MYKEY»)?

Я пытаюсь вызвать 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 выглядит так:

  

И я получаю эту ошибку:

Сведения об исключении: System.Runtime.InteropServices.SEHException: Внешний компонент исключил.

[SEHException (0x80004005): Внешний компонент выбрал исключение.] RoleEnvironmentGetConfigurationSettingValueW (UInt16 *, UInt16 *, UInt32, UInt32 *) +0 Microsoft.WindowsAzure.ServiceRuntime.Internal.InteropRoleManager.GetConfigurationSetting (String name, String & ret) +92 Microsoft .WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue (String configurationSettingName) +67 ChargifyNET.ChargifyAzurePage.get_Chargify () в C: \ NetProjects \ ChargifyDotNET \ Source \ Chargify.NET \ ChargifyAzurePage.cs: 26 Chargify.Azure._Default.Page_Load (отправитель объекта , 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 (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627

Вы получите SEHException, если вы попытаетесь получить доступ к RoleEnvironment, если вы не работаете в ткани dev или Azure. Я считаю, что вы случайно запускаете свой сайт под сервером разработки asp.net, то есть вы не находитесь в dev-структуре (я подтвердил, что это вызовет исключение SEHException). Другими словами, вы либо задали свой проект веб-сайта как проект запуска, либо вы щелкнули его правой кнопкой мыши и сказали ему, чтобы он запускался.

Вы должны установить сам проект облака как проект запуска, который затем покажет ваш веб-сайт, запущенный на порту 81 по умолчанию. Проект облака – это проект, который имеет в качестве своих членов все ваши определения роли. Вы можете посмотреть URL-адрес вашего браузера и легко узнать, работаете ли вы в сервере asp.net dev, потому что вы будете использовать некоторый случайный номер порта, а не порт 81.

Вы должны убедиться, что работаете в ткани dev или Azure, проверяя RoleEnvironment.IsAvailable . Если это правда, вы можете назвать что-либо в RoleEnvironment. Если это неверно, вы не работаете внутри ткани.

Удаление в файле ServiceDefinition.csdef может быть обходным путем для вас, как и для нас, но затем ваш сайт не будет развернут в Full IIS в Cloud. Мы используем 1.7 SDK.

Итак, в резюме: RoleEnvironment.IsAvailable = False с этим включенным в ServiceDefinition.csdef с числом экземпляров 1, которое я могу добавить.

         

Удалите узел и разверните его, и вы можете обнаружить, что теперь RoleEnvironment.IsAvailable = True .

Есть очень мало журналов о том, что на самом деле происходит – сайт работает нормально, нет никаких предупреждений, кроме обычного, у вас есть только один экземпляр, почему бы не развернуть 2, и сайт работает нормально.

Это недавняя проблема, и я считаю, что в этом msshrtmi.dll должны быть внесены некоторые изменения. Он может регистрировать немного больше того, что может быть проблемой, если RoleEnvironment недоступна.

Чтобы следить за этим, на всякий случай, когда кто-то снова столкнется с такой же проблемой, также может случиться так, что по какой-либо причине одно из ваших развертываний застряло в вычислительном эмуляторе.

Что случилось со мной, так это то, что у меня был веброль, содержащий несколько веб-сайтов, каждый из которых привязан к другому имени хоста. Скажем: localhost и test.localhost. Обычно вы можете получить доступ к ним на localhost: 81 и test.localhost: 81. Однако по какой-то странной причине одно развертывание попало в странное состояние, в котором оно будет указано в эмуляторе вычислений, без отладки Visual Studio, он сказал бы, что «экземпляр роли уничтожен» или что-то в этом роде. В этом развертывании сайтов, развернутых в IIS. Затем я, не зная об этом отказоустойчивом развертывании, обращался к URL-адресам по умолчанию, т.е. test.localhost: 81, который будет загружать старые файлы развертывания. (Старый) сайт работал до тех пор, пока я не открыл страницу, которая фактически использовала метод RoleEnvironment.GetConfigurationSettingValue , и только после этого я получил это исключение. Это было действительно разочаровывающе, поскольку это развертывание boggus obvioulsy не ударило ни о каких контрольных точках и не сломалось на исключениях, но оно выглядело точно как сайт, над которым я работал.

Когда я это понял, я открыл имена хостов под новым портом, и там страницы работали, как ожидалось. Как только я удалил это баггие развертывание из эмулятора вычислений, веб-сайты IIS также были удалены, и, к счастью, порты теперь доступны для использования, как ожидалось.

Если вы получите ту же ошибку после того, как убедитесь, что вы используете dev-ткань, попробуйте уменьшить количество экземпляров до одного. Это исправило это для меня.

Тем не менее, кажется странным, что я не могу отлаживать два экземпляра.

Хотя многие отмечают, что вы должны работать с dev / Azure, а не с сервером разработки asp.net, я думаю, стоит упомянуть, что вам нужно выбрать правильную модель исполнения, когда вы публикуете свое приложение на Azure, если вы хотите использовать RoleEnvironment ,

На данный момент существует 3 модели:

  • В.М.
  • Веб-сайт
  • Облачный сервис

Подробнее см. Здесь: http://azure.microsoft.com/en-us/documentation/articles/fundamentals-application-models .

И особенно следующий параграф:

Облачные сервисы, которые были исходной моделью выполнения Azure, являются явно PaaS-подходом. Хотя линия между PaaS и веб-хостингом размыта, Cloud Services отличается некоторыми важными способами с веб-сайтов, в том числе:

  • В отличие от веб-сайтов, облачные службы предоставляют административный доступ к виртуальным машинам вашего приложения. Это позволяет установить произвольное программное обеспечение, которое требуется вашему приложению, что невозможно с веб-сайтами.
  • Поскольку Cloud Services предлагает как веб-роли, так и рабочие роли, это лучший выбор, чем веб-сайты для многоуровневых приложений, для которых требуется отдельная виртуальная машина для своей бизнес-логики.
  • Облачные сервисы обеспечивают отдельную промежуточную и производственную среду, делая обновления приложений более плавными, чем веб-сайты.
  • В отличие от веб-сайтов, вы можете использовать сетевые технологии, такие как Azure Virtual Network и Azure Connect, для подключения локальных компьютеров к приложениям облачных служб.
  • Облачные службы позволяют использовать удаленный рабочий стол для непосредственного подключения к виртуальным машинам приложения, что невозможно с веб-сайтами.

Вы можете проверить RoleEnvironment.IsAvailable . Если это неверно, ваше приложение не работает со временем выполнения Azure, что означает, что RoleEnvironment неприменимо.

  • Azure ASP .net WebApp Истекло время ожидания запроса
  • Interesting Posts

    Как найти IP-адрес моего мостового маршрутизатора?

    Как создать файл FXML для уже созданного нового компонента в java, чем добавить его в конструктор сцен?

    Как обеспечить поддержку разбивки на страницы JTable в Swing?

    Почему производители процессоров перестали увеличивать тактовую частоту своих процессоров?

    Как определить, принадлежит ли персонаж языку Right To Left?

    Доступ к клавишам dict, как атрибут?

    Как получить tmux для открытия набора панелей без ввода вручную?

    Как установить FFmpeg на Debian?

    Смонтируйте диск HFSPlus с разрешениями на чтение и запись в Linux

    Изменение фона экрана входа в Windows 7?

    Как сравнить две переменные объекта в языке выражений EL?

    Выполнение SQL-запросов в таблице Excel в рабочей книге с помощью макроса VBA

    403 предел ставки на вставку иногда преуспевает

    Что произойдет, если видеокарта не сможет получить достаточную мощность?

    Как передать значения (параметры) между страницами XAML?

    Давайте будем гением компьютера.