Welcome to Azure. Блобы разные бывают

Мы уже очень много поговорили о том, что блобы это прекрасно! Мы можем в них хранить большиеобъемы информации за которые мы платим копейки! Нам не надо думать о железках на которых блобы будут храниться! Все что нам нужно — это только платить арендную плату за блобы и использовать их!
Но, блобы могут использоваться не только для хранения файлов, но и для хостинга сильверлайт приложения или сайта!

Вы спросите зачем? Да потому что это очень дешево! Представте — вы платите только 15 центов — и используете 1 гигабайт для хостинга своего сайта! Естественно Вы не сможете хранить сайт у которых есть бизнесс и серверная логика, но для статический файлов — блобы очень девешовое и качественное решение.

Также блобы могут быть идеальным хостингом для сильверлайт или флеш приложение! Собственно, вы можете создать веб портал флеш или сильверлайт игр которые могут быть сохраненны в сервисах хранения данных Ажура!

Итак, давайте начинать. Наверное каждый из нас, кто начинал интересоваться веб программирование когда был маленький — начинал создавать свою страницу, где писал про себя всякого рода информацию, потому начать надо с того что мы создадим с вами свою страницу, которая будет состоять из статического HTML и немного джаваскрипта!

Так как тема этого поста, не основы HTML то и страница будет соответствующего качества:) Исходный код страници:

<html>
  <title>Тайтл:) А вообще моя страница</title>
  <body>
    <img style="width: 600px; height: 600px;" onclick="alert('Hello World!')" src="me.jpg" alt="" />
  </body>
</html>

me.jpg картинка, которая находится в той же директории где и собстевнно сам html файл.
Следующий шаг который мы должны совершить — записать наш статический html в блоб! Для этого я советую использовать приложение которое находиться по следующему аддресу: https://www.myazurestorage.com/

Для того чтобы записывать данные с помощью этой веб аппликации необходимы название вашего сервиса хранения данных и ключ доступа. Для того чтобы их получить:
1. Зайдите на свой аккаунт на портале Ажура.
2. Выберите Storage Account
3. Там Вы увидите название своего сервиса. Если названия нету — добавте новый сервис хранения данных.
4. Для того чтобы получить ключ доступа, нажмите любую View:

5. Во всплывшем окошке нажмите на Copy to Clipboard. Если вылезет окошко которое будет спрашивать разрешать ли Silverlight доступ к буферу обмена — разрешайте:)
6. Используя полученные данные — заходим в приложение myazyrestorage.

Итак, в приложение мы зашли, осталось только создать контейнер и закачать туда файлы. Для этого в приложении совершаем такие действия:
1. Выбираем таб BLOBs
2. Нажимаем «New Container»
3. Даем новому контейнеру имя.
4. После того как контейнер был создан, нажимаем на кнопку Action напротив нашего контейнера. Выбираем пункт Edit
5. В выпадайке с Public Access выбираем Container Level.
6. Все:)

Теперь осталось загрузить наши файлы:
1. В меню Action контейнера выбираем Add Blob.
2. Выбираем путь к файлу, и вводим имя блоба. Тут важно, относитесь к блобам как к файлам которые лежат в одной папке. Тоесть если ссылка на картинку у вас была на файл с именем my.jpg — блоб картинки должен называться my.jpg. Если же вы хотите картнки хранить в папке images — то даже если файл называется my.jpg — блоб должен называться images\my.jpg 🙂 Как помним знак «\» разрешен в именах блобов.
3. Получаем ссылку на файл.

Для того чтобы получить ссылку на файл, проделываем следующий фокус:
просто тыкаем на блоб в котором живет наш файл — в открывшихся свойствах видим параметр с названием URI. Вот и все:)

Сосбтвенно как видим мы легко и ненапрягаясь смогли захостить страничку со статическим HTML на сервисах хранения данных. Интересный вопрос который может возникнуть:
Если я хощщу свой веб проект на Windows машине, то я имею доступ к логам IIS. Тоесть , я могу посмотреть кто доступался на мой сайт, с какого айпи и т.д. и т.п. Как тут?

На самом деле такая проблема есть, и когда вы размещаете свой сайт в блобах такой статистики вы не получите, НО никто не запрещает использывать альтернативные, не менее замечательные решения как google analytics для примера. Просто вставляете в свою страничку блок кода который можно получить с http://www.google.com/analytics — и имеете доступ к логам того кто и как ходил на ваш сайт:)

Так же в блобах с помощью выше приведенного метода вы можете хостить и сильверлайт приложения. Собственно, сильверлайт приложение — это один джаваскрипт файл, одна HTML страница которая будет содарежать в себе объект сильверлайт приложения, и XAP файл, который и хранить в себе само сильверлайт приложение.

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

Если подумать — то ничего сложного нету, и скорее всего вы напишите такое приложение в течении одного — двух дней, и я Вам больше скажу, когда вы его запустите на своем компьютере — все будет работать отлично! Корки начнуться когда вы запишите приложение в Ажур:) Вся причина в схеме безопасности Сильверлайт приложения — по умолчанию, приложение может коммуницировать только с сервисами которые находяться в одном домене в котором размещенны сильверлайт или флеш приложение. Чтобы нормально коммуницировать с отдаленными сервисами, отдаленный сервис толжен хранить в себе кореектную cross-domain policy.

Стандартный cross-domain policy файл может выглядить так:

  <access-policy>
    <cross-domain-access>
      <policy>
        <allow-from http-request-headers="*">
          <domain uri="here is my domain uri"/>
        </allow-from>
        <grant-to>
          <resource path="/" include-subpaths="true"/>
        </grant-to>
      </policy>
    </cross-domain-access>
  </access-policy>

Файл приведенный в листинге указывает на то, что любое сильверлайт приложение которое захощщенно в домене указанном в участке файла:

    <domain uri="here is my domain uri"/>

моежт использовать любые сервиса.
Такие файлы имеют название ClientAccessPolicy.xml. Они используются сильверлайт приложениями, и указывают какие ВАШИ приложения или приложения в домене который вы используете могут посылать запросы к другим сервисам. Также сильверлайт приложения могут использовать сервиса которые имеют CrossDomain.xml. Стандартный CrossDomain файл имеет такое содержание:

<?xml version="1.0" ?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

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

К примеру следующие Silverlight приложение демонстрирует то, как создать приложение которое будет хоститься в блобах и в свою очередь использовать функционал другого сервиса , а точнее Yahoo! Search (код, откровенно признаюсь, полностью сдерт с книги Azure in Action, за что авторам огромное спасибо!).

Итак, для начала создаем просто Silverlight приложение. Листниг файла Main.xaml приведен ниже:

<UserControl x:Class="TestYahooSearch.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Search Yahoo"
VerticalAlignment="Top"
Margin="5"/>
                <TextBox x:Name="txtSearch"
VerticalAlignment="Top"
Height="25" Width="200"
Margin="5"/>
                <Button x:Name="btnSearch"
Content="Search"
VerticalAlignment="Top"
Height="25" Width="50"
Margin="5"
Click="btnSearch_Click"/>
            </StackPanel>
            <ItemsControl x:Name="itemsResults">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid Margin="10">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="25"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <HyperlinkButton Grid.Row="0" Content="{Binding Title}" NavigateUri="{Binding Url}"/>                                                  <TextBlock Grid.Row="1" Text="{Binding Summary}" TextWrapping="Wrap">
                            </TextBlock>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </Grid>
</UserControl>

Код бихайнд приложения:

public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            Search mySearch = new Search();
            mySearch.SearchResultsReturned += new
             Search.SearchResultReturnedDelegate
             (mySearch_SearchResultsReturned);
            mySearch.Execute(txtSearch.Text);


        }
        void mySearch_SearchResultsReturned(SearchResultSet results)
        {
            itemsResults.ItemsSource = results.Results;
        }
    }

    public class Search
    {
        public delegate void SearchResultReturnedDelegate(SearchResultSet results);
        public event SearchResultReturnedDelegate SearchResultsReturned;
        private const string _baseUri = "http://search.yahooapis.com/WebSearchService/V1/webSearch?appid={0}&query={1}&start={2}&results={3}";
        private const string _applicationId = @"Jk.kKH_V34FIj5WGgtm6iimK.37hiKF0A5EVnJkoltzGoydU.Z0notpjqa0DxTiJULlbg--";
        public void Execute(string keyword)
        {
            Uri searchUri = new Uri(string.Format
             (_baseUri, _applicationId, keyword, 1, 5));
            Execute(searchUri);
        }
        private void Execute(Uri address)
        {
            WebClient searchClient = new WebClient();
            searchClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(searchClient_DownloadStringCompleted);
            searchClient.DownloadStringAsync(address);
        }
        void searchClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (SearchResultsReturned != null)
            {
                XElement xeResult = XElement.Parse(e.Result);
                SearchResultSet resultSet =
                 new SearchResultSet(xeResult);
                SearchResultsReturned(resultSet);
            }
        }
    }
    public class SearchResultItem
    {
        public string Title { get; set; }
        public string Summary { get; set; }
        public Uri Url { get; set; }
    }
    public class SearchResultSet
    {
        public SearchResultSet()
        {
            Results = new List<SearchResultItem>();
        }
        public SearchResultSet(XElement resultsXml)
        {
            Results = new List<SearchResultItem>();
            XNamespace ns = "urn:yahoo:srch";
            var xeResults = from xeResult in
                                resultsXml.Elements(ns + "Result")
                            select new SearchResultItem
                            {
                                Title = xeResult
                             .Element(ns + "Title").Value,
                                Summary = xeResult
                                 .Element(ns + "Summary").Value,
                                Url = new Uri(
                                 xeResult.Element(ns + "Url").Value)
                            };
            Results.AddRange(xeResults);
        }
        public List<SearchResultItem> Results { get; set; }
    }

Теперь Вы можете скомпилировать приложение, и сохранить в блобах! Вуаля — у вас свой поисковик, который использует Yahoo:)

Оставьте комментарий