Почему я получаю SEHException при вызове RoleEnvironment.GetConfigurationSettingValue ("MYKEY")? - PullRequest
38 голосов
/ 02 июня 2010

Я пытаюсь позвонить 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 & ret) +92 Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue (строка конфигурацииSettingName) +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 (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) + 627

Ответы [ 5 ]

83 голосов
/ 03 июня 2010

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

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

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

2 голосов
/ 27 сентября 2012

Удаление тега <Sites> в файле ServiceDefinition.csdef может стать для вас обходным путем, как и для нас, но тогда ваш сайт не будет развернут в Full IIS в облаке. Мы используем 1,7 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 нет данных, в нем может быть чуть больше информации о том, что может быть на самом деле проблемой.

1 голос
/ 26 мая 2011

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

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

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

0 голосов
/ 06 августа 2014

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

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

  • VM
  • Веб-сайт
  • Облачная служба

Пожалуйста, обратитесь сюда: http://azure.microsoft.com/en-us/documentation/articles/fundamentals-application-models для более подробной информации.

И особенно следующий абзац:

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

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

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

0 голосов
/ 12 июня 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...