Welcome to Azure. Lessons learned

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

Хирому Аракава, «Стальной алхимик: Братство»(с)


Вначале я подумал что стоит писать про то как синтегрировать блобы с ASP.Net сайтом, но понял что сложностей там даже не должно возникнуть — ибо все очень примитивно, и можна легко использовать. Потому, я решил немного оглянуться назад, посмотреть на что я потратил больше всего времени, и вынести несколько уроков из своих ошибок.

Итак, история номер один — как одно приложение блобы поломали.
Готовлю я значит новый пост, про то как использовать блобы. Так как аккаунт на Ажур у меня казеный, то использовать я его могу только в самых крайних случаях. Запускается эмулятор сервиса хранения данных — и выскакивает сообщение об ошибке. Обернитесь назад, и подумайте: Вам выскакивает какое-то сообщение об ошибке, в мессадж боксе где только 1 кнопка. Будете Вы в него вчитываться?:) Тем более что кроме как нажать кнопку «ОК» у вас выбора нету. Вот и я не вчитывался. После написал небольшое приложение которое запихивает mp3 файлы в блоб, запустил и естественно получил ошибку. При чем ошибка, которая твердила что такого контейнера блобов — нет! И ведь помню что создавал контейнер. Ну думаю — потерлось, надо создать контейнер заново. Начал создавать контейнер — а не тут — то было. Нету вообще хранилища блобов. Совсем. Ну думаю — посмотрю через Server Explorer. Естесвенно dev storage был найден, но когда я кликнул посмотерть что у меня с блобами — я получил ошибку опять. Тут я совсем запутался, и не знал куда смотреть. Открыл эмулятор сервисов хранения данных — оп — блобы остановленны. Ну думаю : «Вот я валенок, с такой ошибкой так долго боролся, а надо всего лишь включить эмуляцию блобов.». Когда же я попытался запустить сервисы блобов — я получил тот же еррор мессадж который был вначале:) Тут уж я естественно вчитался — и был крайне удивлен, потому как сообщение твердило , что процесс не может доступиться к файлу, потому как файл уже занят другим процессом.
Тут у меня началась паника — какой файл, какой процесс, что вообще твориться? Перегрузка компьютера не помогла. Ситуация становилась абсурдной — все есть, а ниче не работает. Когда ничего не помогает — мы читаем инструкцию, ну собсвенно я не изменил этой извечной традиции, и пошел в интернет. Перерыв кучу форумов, я таки нашел ещё одного такого же неудачника как я — он не мог найти проблему, потому как она повторялась у него только в случае если та одна программа запущенна. Выключив ту самую программу, я попытался запустить сервисы опять — и неожиданно все заработало:) А все почему — порт то один — потому когда та самая программа запускалась, она захватывала порт, и сервисы хранения данных не могли достучаться. Естественно возникает вопрос — почему настолько информативное сообщение?:) Ну да ладно, если у Вас возникнет такая же проблема — проверте свободны ли порты которые используют Ваши сервисы хранения данных, быть может они просто не могут к ним пробиться.

Как сильверлайт не мог понять где он
Помните, мы с Вами говорили о том, что адрес WCF сервиса который мы хотим использовать лучше всего хранить в настройках веб роли? Действительно удобно — ведь для тестинга мы будем использовать стайджинг среду, когда наш продукт увидить мир — мы будем использовать уже продакшен среду, потому адрес сервиса поменяется. Да и вообще — это как-то более правильно:) Определение находиться ли наше приложение в среде Ажур, да и получение настроек веб роли просиходит через Microsoft.WindowsAzure.ServiceRuntime. Ссылка на вцф сервис у меня была в сильверлайт проекте. Без задней мысли я добавляю ссылку на Microsoft.WindowsAzure.ServiceRuntime, ну мне ж надо считать настройки роли чтобы правильно доступиться к сервису, и естественно получаю щелбан в нос — потому как эта библиотека не сильверлайтовская. Собственно тут у меня и наступил ступор:) Как двигаться и что делать — именно эти два вопроса мучали меня. Естественно , я решил что Микрософт имеет козырь в запасе — и есть SDK для сильверлайт проектов — опять щелбан — нету. Тут я сразу пошел в инструкции. И не нашел. Потому решил думать дальше, и придумал решение ( вот именно такие моменты поднимают самооценку:) ).
Ведь мы можем передать параметры в сильверлайт с веб странички на которой сильверлайт объект лежит. Выглядит это приблизительно так:

    <div id="silverlightControlHost">
        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
            width="100%" height="100%">
            <param name="initParams" value="accountService=<%= GetAccountServiceConnectionString() %>"/>
            <param name="source" value="ClientBin/SomeApplication.xap" />
            <param name="onError" value="onSilverlightError" />
            <param name="background" value="white" />
            <param name="minRuntimeVersion" value="4.0.50826.0" />
            <param name="autoUpgrade" value="true" />
            <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration: none">
                <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight"
                    style="border-style: none" />
            </a>
        </object>
        <iframe id="_sl_historyFrame" style="visibility: hidden; height: 0px; width: 0px;
            border: 0px"></iframe>
    </div>

Пристальное внимание советую обратить на эту строчку:

            <param name="initParams" value="accountService=<%= GetAccountServiceConnectionString() %>"/>

Как видим, в сильверлайт объект передается секция параметр под названием initParams, с параметром accountService который будет иметь значение из метода: GetAccountServiceConnectionString.

Собственно вот и он:

        /// <summary>
        /// Gets the account service connection string.
        /// </summary>
        /// <returns></returns>
        public string GetAccountServiceConnectionString()
        {
            if (RoleEnvironment.IsAvailable)
            {
                return RoleEnvironment.GetConfigurationSettingValue("AccountServiceConnection");
            }
            else
            {
                return "127.0.0.1/tempservice.svc";
            }
        }

Как видим, мы можем безболезненно добавить ссылку на Microsoft.WindowsAzure.ServiceRuntime в ASP.Net проект нашей веб роли, поэтому можем пользоваться всеми благами которые она предоставляет. Все что осталось — просто считать эти параметры в сильверлайт приложении:

            IDictionary<string, string> parameters = e.InitParams;
            AccountServiceConnectionString = parameters["accountService"];

Вот и все.

В дальнейшем я буду постить ещё уроки которые я получил разрабатывая приложения для Ажур.