WedX - журнал о программировании и компьютерных науках

Проблема с Azure на сервере разработки

У меня возникли проблемы с работой Azure на сервере разработки. У меня есть приложение Silverlight, которое я хочу подключить к Azure, поэтому я предоставляю REST API из веб-роли.

Вот мой класс обслуживания:

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ExpenseService
{
    private ExpenseDataSource expenseData = new ExpenseDataSource();

    [OperationContract]
    [WebGet(UriTemplate="expenses", ResponseFormat=WebMessageFormat.Xml)]
    public List<String> GetExpenses()
    {
        return expenseData.Select().ToList();
    }
}

Инициализация типа ExpenseDataSource не удалась:

public class ExpenseDataSource
{
    private static CloudStorageAccount storageAccount;
    private ExpenseTableContext context;

    static ExpenseDataSource()
    {
        CloudStorageAccount.SetConfigurationSettingPublisher(
            (configName, configSettingPublisher) =>
            {
                string connectionString = RoleEnvironment.GetConfigurationSettingValue(configName);
                configSettingPublisher(connectionString);
            }
        );

        storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");

        CloudTableClient.CreateTablesFromModel(typeof(ExpenseTableContext), storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials);
    }
    // ...
}

Ошибка:

SEHException было поймано

Внешний компонент вызвал ошибку исключения.

Я не уверен, что я делаю неправильно. Я пытаюсь следовать этому руководству. Автор описывает необходимость сделать что-то по-другому для сред, отличных от Azure, например для тестов NUnit. Нужно ли мне что-то делать для работы на сервере разработки? Должен ли я просто настроить это приложение для использования реального хранилища Azure, даже если оно работает на моей машине?

Обновление: если я закомментирую конструктор ExpenseDataSource и просто использую поддельные данные, сервис будет работать нормально.

Обновление 2: @Maupertuis ответил, что я не могу настроить учетную запись хранения из статического инициализатора. Однако это взято непосредственно из примера кода MS Windows Azure:

public class GuestBookEntryDataSource
{
    private static CloudStorageAccount storageAccount;
    private GuestBookDataContext context;

    static GuestBookEntryDataSource()
    {
        storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");

        CloudTableClient.CreateTablesFromModel(
            typeof(GuestBookDataContext),
            storageAccount.TableEndpoint.AbsoluteUri,
            storageAccount.Credentials);
    }
    // ...
 }

Может ли это когда-нибудь сработать?

09.10.2010

Ответы:


1

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

вам следует создать класс, производный от класса RoleEntryPoint. его метод OnStart будет вызываться при запуске роли.

Вот пример:

public class WebRole: RoleEntryPoint
    {
        public override bool OnStart()
            {
            #region Setup CloudStorageAccount Configuration Setting Publisher

            // This code sets up a handler to update CloudStorageAccount instances when their corresponding
            // configuration settings change in the service configuration file.
            CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
            {
                // Provide the configSetter with the initial value
                configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));

                RoleEnvironment.Changed += (sender, arg) =>
                {
                    if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>()
                        .Any((change) => (change.ConfigurationSettingName == configName)))
                    {
                        // The corresponding configuration setting has changed, propagate the value
                        if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)))
                        {
                            // In this case, the change to the storage account credentials in the
                            // service configuration is significant enough that the role needs to be
                            // recycled in order to use the latest settings. (for example, the 
                                // endpoint has changed)
                            RoleEnvironment.RequestRecycle();
                        }
                    }
                };
            });
            #endregion

            return base.OnStart();
        }
    }
09.10.2010
  • Да, отключение SO - это огромная боль. Спасибо за ответ, я попробую это. Причина, по которой я думал, что это будет нормально, заключается в учебном комплекте Windows Azure, который я скачал с MSFT (опубликовано выше). Странный. 09.10.2010
  • Я поместил вызов SetConfigurationSettingPublisher в OnStart(), но он так и не был вызван. Я поставил там точку останова, которая не сработала. Я думал, что OnStart() всегда бегал? 09.10.2010
  • Является ли ваш класс WebRole общедоступным? он наследуется от RoleEntryPoint? Это единственный класс RoleEntryPoint в вашем приложении? 11.10.2010
  • Да всем тем. Я почти уверен, что проблема в том, что сервер разработки уже запущен. 12.10.2010

  • 2

    Вы не должны вызывать SetConfigurationSettingPublisher из статического конструктора. Нет гарантии, что он запустится вообще, а если он запустится, то нет никакой гарантии ни в том, когда он запустится.

    Если на самом деле, есть гарантии, что он будет выполнен при инициализации типа. Это прямо перед первым использованием вашего класса ExpenseDataSource. Если вы не используете его в своем приложении, статический конструктор также не будет выполняться. Поскольку SetConfigurationSettingPublisher должен вызываться перед первым запросом (если я хорошо помню), вы понимаете, что статический конструктор на самом деле не подходит.

    Вам следует создать класс, производный от RoleEntryPoint, чье переопределение OnStart всегда будет вызываться платформой Azure при ее запуске:

    public class WebRole: RoleEntryPoint
        {
            public override bool OnStart()
            {
                #region Setup CloudStorageAccount Configuration Setting Publisher
    
                // This code sets up a handler to update CloudStorageAccount instances when their corresponding
                // configuration settings change in the service configuration file.
                CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    // Provide the configSetter with the initial value
                    configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
    
                    RoleEnvironment.Changed += (sender, arg) =>
                    {
                        if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>()
                            .Any((change) => (change.ConfigurationSettingName == configName)))
                        {
                            // The corresponding configuration setting has changed, propagate the value
                            if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)))
                            {
                                // In this case, the change to the storage account credentials in the
                                // service configuration is significant enough that the role needs to be
                                // recycled in order to use the latest settings. (for example, the 
                                // endpoint has changed)
                                RoleEnvironment.RequestRecycle();
                            }
                        }
                    };
                });
                #endregion
    
                return base.OnStart();
            }
        }
    

    Это пример, вы можете разместить здесь любой код инициализации, который требуется вашему приложению.

    09.10.2010
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

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


    Для любых предложений по сайту: [email protected]