Работа с Windows AzureQueue
Задание 2
Для следующего задания можно "усовершенствовать" предыдущую веб - форму, но мы предпочли создать новую - AzureQueueSample2.aspx :
asp - код веб формы для второго задания:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AzureQueueSample2.aspx.cs" Inherits="WebRole1.AzureQueueSample2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <style type="text/css"> .style1 { width: 268px; } .style2 { width: 247px; } </style> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="Label4" runat="server" Font-Bold="True" Font-Size="X-Large" Text="Windows Azure Queue - Second Example"></asp:Label> <br /> <table style="width:100%;"> <tr> <td class="style1"> <asp:Label id="lb_inert" Text="Добавить в очередь сообщение:" runat="server" /> </td> <td class="style2"> <asp:TextBox id="tb_insert" runat="server" /> </td> <td> <asp:Button ID="bnt_addmessage" Text="Добавить сообщение" runat="server" onclick="bnt_addmessage_Click" Width="231px" /> </td> </tr> <tr> <td class="style1"> <asp:Label id="lb_binarydata" Text="Добавить, как двойчный объект:" runat="server" /> </td> <td class="style2"> <asp:FileUpload ID="fu_insertbinary" runat="server" /> </td> <td> <asp:Button ID="btn_addbinary" Text="Добавить двоичные данные" runat="server" onclick="btn_addbinary_Click" /> </td> </tr> <tr> <td class="style1"> <asp:Button ID="btn_getmessage" Text="Получить сообщение" runat="server" onclick="btn_getmessage_Click" /> </td> <td class="style2"> <asp:Label id="lb_retrievedmessage" runat="server" /> </td> <td> </td> </tr> </table> <br /> <asp:Repeater id="Repeater1" runat="server"> <HeaderTemplate> <table border="1"> <tr><td><b>Queue Messages</b></td></tr> </HeaderTemplate> <ItemTemplate> <tr> <td> <asp:Label ID="Label1" runat="server" Text="<%# Container.DataItem %>" /> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> </div> </form> </body> </html>
Наша задача состоит в следующем:
- Реализовать функционал создания очереди
- Добавить сообщение в очередь
- Добавить в очередь файл, в виде двойного объекта
- Отобразить сообщения очереди
- Получить сообщение из очереди
Добавьте следующие ссылки в AzureQueueSample2.aspx.cs :
using System.IO; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; using Microsoft.WindowsAzure.ServiceRuntime;
Также определим переменные учетной записи, очереди и клиента до метода PageLoad :
CloudStorageAccount storageAccount = null; CloudQueue cloudQueue = null; CloudQueueClient queueClient = null;
Для выполнения первого пункта, добавим следующий код в метод PageLoad :
// определение контекста this.storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString"); this.queueClient = storageAccount.CreateCloudQueueClient(); // создание очереди this.cloudQueue = this.queueClient.GetQueueReference("myqueue"); this.cloudQueue.CreateIfNotExist(); this.DisplayMesssages();
Для добавления сообщения в очередь, создадим метод, обрабатывающий событие нажатия кнопки btn_addmessage :
protected void bnt_addmessage_Click(object sender, EventArgs e) { CloudQueueMessage msg = new CloudQueueMessage(this.tb_insert.Text); this.cloudQueue.AddMessage(msg); this.DisplayMesssages(); }
Для отображения содержимого очереди, создадим метод DisplayMessages :
private void DisplayMesssages() { // получение первых пяти сообщений, без удаления их из очереди var msgs = this.cloudQueue.PeekMessages(5); var cloudList = new List<string>(); foreach (var msg in msgs) { cloudList.Add("Message ID: " + msg.Id + "; Message: " + msg.AsString + "; Message insertion time: " + msg.InsertionTime); } // привязка к источнику данных this.Repeater1.DataSource = cloudList; this.Repeater1.DataBind(); }
Для добавления очередь файла, создадим метод обрабатывающий нажатие кнопки btn_addbinary:
protected void btn_addbinary_Click(object sender, EventArgs e) { // файл не должен превышать размер - лимит сообщения - 8Кб CloudQueueMessage msg = new CloudQueueMessage(File.ReadAllBytes(fu_insertbinary.FileName)); this.cloudQueue.AddMessage(msg); this.DisplayMesssages(); }
Осталось только написать метод, для получения сообщения из очереди, обратите внимание, что при этом сообщение из очереди удаляется, а получить можно только первое сообщение из очереди (подробнее об очередях смотри лекции № "Windows Azure Table - программирование" - "Хранилище данных с реляционной структурой" ):
protected void Page_Load(object sender, EventArgs e) { this.storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString"); this.queueClient = storageAccount.CreateCloudQueueClient(); this.cloudQueue = this.queueClient.GetQueueReference("myqueue"); this.cloudQueue.CreateIfNotExist(); this.DisplayMesssages(); }
Теперь запустим приложение и протестируем функционал.
Обратим ваше внимание на то, что файл, который можно добавить в очередь должен соответствовать следующим условиям:
- размер файла не должен превышать 8Кб
- файл должен находиться: [путь к проекту AzureQueueExample]\bin\Debug\CloudService1.csx\roles\WebRole1
В случае, если выполнение задания вызвало сложности и затруднения, в приложениях к данной практической работе вы найдете итоговый программный код в том виде, в котором он необходим для последнего задания.