Мы уже очень много поговорили о том, что блобы это прекрасно! Мы можем в них хранить большиеобъемы информации за которые мы платим копейки! Нам не надо думать о железках на которых блобы будут храниться! Все что нам нужно — это только платить арендную плату за блобы и использовать их!
Но, блобы могут использоваться не только для хранения файлов, но и для хостинга сильверлайт приложения или сайта!
Вы спросите зачем? Да потому что это очень дешево! Представте — вы платите только 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:)