Опубликован: 25.05.2011 | Уровень: специалист | Доступ: платный
Лекция 9:

Microsoft® .NET Services

Лабораторная работа 5. Работа с Blob

Целью лабораторной работы является практическое освоение процесса работы с Blob в Windows Azure.

Аппаратура и программные инструменты, необходимые для лабораторной работы

  1. Настольный или портативный компьютер, поддерживающий виртуализацию, операционная система Microsoft Windows XP, Vista, Windows 7.
  2. Доступ к сети Интернет.
  3. Наличие аккаунта Windows Azure.

Продолжительность лабораторной работы

2 академических часа

Получение Blob данных из хранилища

  1. Откройте меню Пуск | Все программы| Microsoft Visual Studio 2010 | Microsoft Visual Studio 2010.
  2. В меню File выберите Open и затем Project/Solution. Откройте файл проекта ExploringWindowsAzureStorageVS2010\Source\Ex02-WorkingWithBlobs\begin\CS\begin.sln
  3. В Solution Explorer, в проекте RDImageGallery нажмите правой кнопкой по узлу RDImageGallery_WebRole и выберите Properties

  4. На закладке Settings создайте ConnectionString с именем DataConnectionStrin. Выберите Use development storage


  5. Создайте String с именем ContainerName и значением gallery

  6. В Solution Explorer нажмите правой кнопкой по Default.aspx в проекте RDImageGallery_WebRole, выберите View Code, объявите следующие пространства имен
  7. Убедитесь что в начале файла объявлены пространства имен
    using Microsoft.WindowsAzure; 
     using Microsoft.WindowsAzure.StorageClient; 
     using Microsoft.WindowsAzure.ServiceRuntime;
  8. В конец класса _Default добавьте метод
    private void EnsureContainerExists() 
     { 
       var container = GetContainer(); 
       container.CreateIfNotExist(); 
      
       var permissions = container.GetPermissions(); 
       permissions.PublicAccess = BlobContainerPublicAccessType.Container; 
       container.SetPermissions(permissions); 
     }
  9. В конец класса _Default добавьте метод
    private CloudBlobContainer GetContainer() 
     { 
       // Get a handle on account, create a blob storage client and get container proxy 
       var account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString"); 
       var client = account.CreateCloudBlobClient(); 
      
       return client.GetContainerReference(RoleEnvironment.GetConfigurationSettingValue("ContainerName")); 
     }
  10. Добавьте следующий код в метод Page_Load
    protected void Page_Load(object sender, EventArgs e) 
     { 
       try 
       { 
         if (!IsPostBack) 
         { 
           this.EnsureContainerExists(); 
         } 
         this.RefreshGallery(); 
       } 
       catch (System.Net.WebException we) 
       { 
         status.Text = "Network error: " + we.Message; 
         if (we.Status == System.Net.WebExceptionStatus.ConnectFailure) 
         { 
           status.Text += "<br />Please check if the blob storage service is running at " + 
           ConfigurationManager.AppSettings["storageEndpoint"]; 
         } 
       } 
       catch (StorageException se) 
       { 
         Console.WriteLine("Storage service error: " + se.Message); 
       } 
     }
  11. В конец класса _Default добавьте метод
    private void RefreshGallery() 
     { 
       images.DataSource = 
         this.GetContainer().ListBlobs(new BlobRequestOptions() 
                                 { 
                                   UseFlatBlobListing = true, 
                                   BlobListingDetails = BlobListingDetails.All 
                                 }); 
       images.DataBind(); 
     }
  12. Нажмите F5 для запустка приложения. Запустится браузер с приложением.


Загрузка Blob данных в хранилище

  1. Откройте Default.aspx.cs
  2. Добавьте метод в конец страницы
    private void SaveImage(string id, string name, string description, 
       string tags, string fileName, string contentType, byte[] data) 
     { 
       // Create a blob in container and upload image bytes to it 
       var blob = this.GetContainer().GetBlobReference(name); 
      
       blob.Properties.ContentType = contentType; 
      
       // Create some metadata for this image 
       var metadata = new NameValueCollection(); 
       metadata["Id"] = id; 
       metadata["Filename"] = fileName; 
       metadata["ImageName"] = String.IsNullOrEmpty(name) ? "unknown" : name; 
       metadata["Description"] = String.IsNullOrEmpty(description) ? "unknown" : description; 
       metadata["Tags"] = String.IsNullOrEmpty(tags) ? "unknown" : tags; 
      
       // Add and commit metadata to blob 
       blob.Metadata.Add(metadata); 
       blob.UploadByteArray(data); 
     }
  3. Измените метод upload_Click
    protected void upload_Click(object sender, EventArgs e) 
     { 
       if (imageFile.HasFile) 
       { 
         status.Text = "Inserted [" + imageFile.FileName + "] - 
       Content Type [" + imageFile.PostedFile.ContentType + "] - 
      Length [" + imageFile.PostedFile.ContentLength + "]"; 
      
         this.SaveImage( 
           Guid.NewGuid().ToString(), 
           imageName.Text, 
           imageDescription.Text, 
           imageTags.Text, 
           imageFile.FileName, 
           imageFile.PostedFile.ContentType, 
           imageFile.FileBytes 
         ); 
      
         RefreshGallery(); 
       } 
       else 
         status.Text = "No image file"; 
     }
  4. Нажмите F5 для запуска приложения
  5. Введете метаданные Name, Description и Tags . Для выбора изображения нажмите Browse

  6. Нажмите Upload Image для публикации изображения в веб приложении

Извлечение метаданных для Blob в хранилище

  1. Откройте Default.aspx в режиме Design, выберите контрол imagesListView и в окне свойств нажмите кнопку Events

  2. Найдите метод OnBlobDataBound и вставьте следующий код
    protected void OnBlobDataBound(object sender, ListViewItemEventArgs e) 
     { 
     if (e.Item.ItemType == ListViewItemType.DataItem) 
       { 
         var metadataRepeater = e.Item.FindControl("blobMetadata") as Repeater; 
         var blob = ((ListViewDataItem)(e.Item)).DataItem as CloudBlob; 
      
         // If this blob is a snapshot, rename button to "Delete Snapshot" 
         if (blob != null) 
         { 
           if(blob.SnapshotTime.HasValue) 
           { 
             var delBtn = e.Item.FindControl("deleteBlob") as LinkButton; 
             if (delBtn != null) delBtn.Text = "Delete Snapshot"; 
      
               var snapshotBtn = e.Item.FindControl("SnapshotBlob") as LinkButton; 
               if (snapshotBtn != null) snapshotBtn.Visible = false; 
           } 
      
           if (metadataRepeater != null) 
           { 
             //bind to metadata 
             metadataRepeater.DataSource = from key in blob.Metadata.AllKeys 
                                           select new 
                                           { 
                                             Name = key, 
                                             Value = blob.Metadata[key] 
                                           }; 
             metadataRepeater.DataBind(); 
           } 
         } 
       } 
     }
  3. Нажмите F5 для запуска приложения. Убедитесь что отображаются метаданные для изображения, загруженного ранее

Нияз Сабиров
Нияз Сабиров

Здравствуйте. А уточните, пожалуйста, по какой причине стоимость изменилась? Была стоимость в 1 рубль, стала в 9900 рублей.

Елена Сапегова
Елена Сапегова

для получения диплома нужно ли кроме теоретической части еще и практическую делать? написание самого диплома требуется?

Иван Бузмаков
Иван Бузмаков
Россия, Сарапул
Никита Сомов
Никита Сомов
Россия, Удмуртская республика

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.3631104729176watchdog( )../bootstrap.inc:0
23.3634104731672module_invoke( )../bootstrap.inc:967
33.3634104733528call_user_func_array ( )../module.inc:462
43.3634104733864devel_watchdog( )../module.inc:462
53.3636104734712decode_entities( )../devel.module:382
63.3636104736632drupal_error_handler( )../devel.module:340
73.3636104740240watchdog( )../common.inc:663
83.3636104742336module_invoke( )../bootstrap.inc:967
93.3636104744192call_user_func_array ( )../module.inc:462
103.3636104744528devel_watchdog( )../module.inc:462
113.3637104745224decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.3631104729176watchdog( )../bootstrap.inc:0
23.3634104731672module_invoke( )../bootstrap.inc:967
33.3634104733528call_user_func_array ( )../module.inc:462
43.3634104733864devel_watchdog( )../module.inc:462
53.3636104734712decode_entities( )../devel.module:382
63.3636104736632drupal_error_handler( )../devel.module:340
73.3636104740240watchdog( )../common.inc:663
83.3636104742336module_invoke( )../bootstrap.inc:967
93.3636104744192call_user_func_array ( )../module.inc:462
103.3636104744528devel_watchdog( )../module.inc:462
113.3637104745224decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.3631104729176watchdog( )../bootstrap.inc:0
23.3634104731672module_invoke( )../bootstrap.inc:967
33.3634104733528call_user_func_array ( )../module.inc:462
43.3634104733864devel_watchdog( )../module.inc:462
53.3636104734712decode_entities( )../devel.module:382
63.3643104736824drupal_error_handler( )../devel.module:340
73.3643104740512watchdog( )../common.inc:663
83.3643104742608module_invoke( )../bootstrap.inc:967
93.3643104744464call_user_func_array ( )../module.inc:462
103.3643104744800devel_watchdog( )../module.inc:462
113.3644104745576decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.3631104729176watchdog( )../bootstrap.inc:0
23.3634104731672module_invoke( )../bootstrap.inc:967
33.3634104733528call_user_func_array ( )../module.inc:462
43.3634104733864devel_watchdog( )../module.inc:462
53.3636104734712decode_entities( )../devel.module:382
63.3643104736824drupal_error_handler( )../devel.module:340
73.3643104740512watchdog( )../common.inc:663
83.3643104742608module_invoke( )../bootstrap.inc:967
93.3643104744464call_user_func_array ( )../module.inc:462
103.3643104744800devel_watchdog( )../module.inc:462
113.3644104745576decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.3650104729720watchdog( )../bootstrap.inc:0
23.3650104731816module_invoke( )../bootstrap.inc:967
33.3650104733672call_user_func_array ( )../module.inc:462
43.3650104734008devel_watchdog( )../module.inc:462
53.3650104734712decode_entities( )../devel.module:382
63.3651104736632drupal_error_handler( )../devel.module:340
73.3651104740240watchdog( )../common.inc:663
83.3651104742336module_invoke( )../bootstrap.inc:967
93.3651104744192call_user_func_array ( )../module.inc:462
103.3651104744528devel_watchdog( )../module.inc:462
113.3651104745224decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.3650104729720watchdog( )../bootstrap.inc:0
23.3650104731816module_invoke( )../bootstrap.inc:967
33.3650104733672call_user_func_array ( )../module.inc:462
43.3650104734008devel_watchdog( )../module.inc:462
53.3650104734712decode_entities( )../devel.module:382
63.3651104736632drupal_error_handler( )../devel.module:340
73.3651104740240watchdog( )../common.inc:663
83.3651104742336module_invoke( )../bootstrap.inc:967
93.3651104744192call_user_func_array ( )../module.inc:462
103.3651104744528devel_watchdog( )../module.inc:462
113.3651104745224decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.3650104729720watchdog( )../bootstrap.inc:0
23.3650104731816module_invoke( )../bootstrap.inc:967
33.3650104733672call_user_func_array ( )../module.inc:462
43.3650104734008devel_watchdog( )../module.inc:462
53.3650104734712decode_entities( )../devel.module:382
63.3656104736824drupal_error_handler( )../devel.module:340
73.3656104740512watchdog( )../common.inc:663
83.3656104742608module_invoke( )../bootstrap.inc:967
93.3656104744464call_user_func_array ( )../module.inc:462
103.3656104744800devel_watchdog( )../module.inc:462
113.3657104745576decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.3650104729720watchdog( )../bootstrap.inc:0
23.3650104731816module_invoke( )../bootstrap.inc:967
33.3650104733672call_user_func_array ( )../module.inc:462
43.3650104734008devel_watchdog( )../module.inc:462
53.3650104734712decode_entities( )../devel.module:382
63.3656104736824drupal_error_handler( )../devel.module:340
73.3656104740512watchdog( )../common.inc:663
83.3656104742608module_invoke( )../bootstrap.inc:967
93.3656104744464call_user_func_array ( )../module.inc:462
103.3656104744800devel_watchdog( )../module.inc:462
113.3657104745576decode_entities( )../devel.module:382