<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" media="screen" href="/styles/xslt/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:c9="http://channel9.msdn.com">
<channel>
	<title>Comment Feed for Channel 9 - Utilizando o Blob para substituir o file system</title>
	<atom:link rel="self" type="application/rss+xml" href="http://channel9.msdn.com/posts/Utilizando-o-Blob-para-substituir-o-file-system/rss"></atom:link>
	<image>
		<url>http://files.channel9.msdn.com/thumbnail/af195726-8d21-4139-9053-52689da4fbe5.png</url>
		<title>Channel 9 - Utilizando o Blob para substituir o file system</title>
		<link></link>
	</image>
	<description>As m&#225;quinas virtuais utilizadas no Windows Azure s&#227;o stateless, ou seja, n&#227;o mant&#233;m o seu estado entre as opera&#231;&#245;es de update (Hardware ou Software) e por isso, se utilizar o armazenamento local de sua m&#225;quina virtual voc&#234; pode perder todos os seus dados. Para evitar a perda de dados e ainda podermos acessar o os dados em qualquer lugar, vamos utilizar o Windows Azure Storage. Tivemos um artigo no m&#243;dulo de Introdu&#231;&#227;o do MVA falando somente sobre o Windows Azure Storage, se precisar rever os conte&#250;do apresentado clique aqui. A aplica&#231;&#227;o TailspinSpyworks tem uma p&#225;gina com a fun&#231;&#227;o de cadastrar novos produtos. Neste cadastro &#233; necess&#225;rio incluir uma foto do produto, o arquivo da imagem &#233; salvo dentro de uma pasta da aplica&#231;&#227;o. Em cen&#225;rios de alta disponibilidade, n&#227;o &#233; uma boa pr&#225;tica a aplica&#231;&#227;o ter referencia para um pasta local. Neste exerc&#237;cio voc&#234; ir&#225; trocar este mecanismo para gravar a imagem no servi&#231;o de Blob do Windows Azure. Passo 1 – Provisionar uma conta de storage no Windows Azure Neste passo voc&#234; criar&#225; uma nova conta de storage para usar o servi&#231;o de Blob do Windows Azure. 1. Acesse pelo Internet&amp;nbsp;Explorer o portal do Windows Azure https://windows.azure.com.&amp;nbsp; Se necess&#225;rio, fa&#231;a login com sua conta&amp;nbsp;do Windows Live; 2. Em Servi&#231;os&amp;nbsp;hospedados, Contas de armazenamento e CDN (Hosted Services, Storage&amp;nbsp;Accounts &amp;amp; CDN), no painel do lado esquerdo, clique em Contas de&amp;nbsp;Armazenamento (Storage Accounts), em seguida clique em Nova conta de Armazenamento (New Storage Accout).  3.&amp;nbsp;Preencha a janela&amp;nbsp;Criar uma nova conta de Armazenamento (Create a New Storage&amp;nbsp;Account)&amp;nbsp;com a sua subscri&#231;&#227;o do Windows Azure, uma URL &#250;nica para a nova conta de storage, escolha uma regi&#227;o&amp;nbsp;(OBS: utilize a mesma regi&#227;o dos servi&#231;os de compute), em seguida clique em OK.  4. Selecione a conta de storage que voc&#234; acabou de criar e copie a Blob URL do painel de&amp;nbsp;propriedades e cole em um bloco de notas (notepad). Em seguida clique no&amp;nbsp;bot&#227;o Exibir (View) da Chave de acesso prim&#225;rio (Primary&amp;nbsp;access key).  5. Na janela View&amp;nbsp;Storage Access Keys, clique no bot&#227;o ao lado do campo Chave de acesso prim&#225;rio (Primary access key) para copiar a chave e cole no bloco de notas.&amp;nbsp; &amp;nbsp; &amp;nbsp; Passo 2 – Alterar o c&#243;digo da aplica&#231;&#227;o para usar o servi&#231;o de Blob do Windows Azure Esta &#233; a minha parte favorita, fazer altera&#231;&#245;es de c&#243;digo em algumas p&#225;ginas do projeto TailspinSpyworks. 1. Execute o Visual&amp;nbsp;Studio como administrador de Start | All Programs | Microsoft Visual Studio&amp;nbsp;clique com o bot&#227;o&amp;nbsp;direito&amp;nbsp;do mouse no&amp;nbsp;atalho do Microsoft&amp;nbsp;Visual Studio e&amp;nbsp;selecione Run as administrator. 2. Se a janela User&amp;nbsp;Account Control aparecer, clique Yes. 3. Na op&#231;&#227;o File do menu, escolha Open em seguida Project/Solution. 4. Na janela Open&amp;nbsp;Project, procure o arquivo TailspinSpyworks.sln para abrir a solu&#231;&#227;o. 5. Abra o arquivo ProductAdd.aspx.cs localizado na raiz do projeto TailspinSpyworks. 6. A primeira altera&#231;&#227;o &#233; incluir as refer&#234;ncias. Clique com o bot&#227;o direito do mouse sobre o ptojeto TailSpinSpyworks e selecione &amp;quot;Add Reference&amp;quot;. Na aba Browse, v&#225; para a pasta C:\Program Files\Windows Azure SDK\v1.6\ref e selecione os arquivos: Microsoft.WindowsAzure.ServiceRuntime.dll; Microsoft.WindowsAzure.StorageClient.dll. 6.1. Em seguida abra o arquivo ProductAdd.aspx.cs e posicione o cursor na linha 10, e inclua o c&#243;digo abaixo. using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;
using Microsoft.WindowsAzure.StorageClient.Protocol;
 6.2. Ainda no arquivo ProductAdd.aspx.cs, posicione o cursor na linha 27, e inclua o c&#243;digo abaixo. try{
       if (!IsPostBack)
       {
           this.EnsureContainerExists();
       }
}
catch (System.Net.WebException we){
   Error.Text = &amp;quot;Network error: &amp;quot; &amp;#43; we.Message;
   if (we.Status == System.Net.WebExceptionStatus.ConnectFailure)
   {
       Error.Text &amp;#43;= &amp;quot;&amp;lt;br /&amp;gt;Please check if the blob service is running at &amp;quot; &amp;#43;ConfigurationManager.AppSettings[&amp;quot;storageEndpoint&amp;quot;];
    }
}catch (StorageException se){
   Console.WriteLine(&amp;quot;Storage service error: &amp;quot; &amp;#43; se.Message);
}
 6.3. Agora posicione o cursor logo abaixo da fun&#231;&#227;o Page_Load e inclua o c&#243;digo abaixo. &amp;nbsp;private CloudBlobContainer GetContainer()
        {
            // Get a handle on account, create a blob service client and get container proxy
            //var account = CloudStorageAccount.FromConfigurationSetting(&amp;quot;DataConnectionString&amp;quot;);
            CloudStorageAccount account;
            CloudStorageAccount.TryParse(&amp;quot;DefaultEndpointsProtocol=https;AccountName=azure20111025a;AccountKey=Rl9ZI3Z88Sf6QHr9gMbdcVz6GFshIpA13Gpfp7&amp;#43;&amp;#43;fdLoWXDT7dCor1/op9w78XNTKmpFXKR8&amp;#43;2EM/YCCLeDDvA==&amp;quot;, out account);

            var client = account.CreateCloudBlobClient();

            //return client.GetContainerReference(RoleEnvironment.GetConfigurationSettingValue(&amp;quot;ContainerName&amp;quot;));
            return client.GetContainerReference(&amp;quot;gallery&amp;quot;);

        }


        private void EnsureContainerExists()
        {
            var container = GetContainer();
            container.CreateIfNotExist();
            var permissions = container.GetPermissions();
            permissions.PublicAccess = BlobContainerPublicAccessType.Container;
            container.SetPermissions(permissions);
        }

         private void GravarImagemAzureBlob(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[&amp;quot;Id&amp;quot;] = id;
            metadata[&amp;quot;Filename&amp;quot;] = fileName;
            metadata[&amp;quot;ImageName&amp;quot;] = String.IsNullOrEmpty(name) ? &amp;quot;unknown&amp;quot; : name;
            metadata[&amp;quot;Description&amp;quot;] = String.IsNullOrEmpty(description) ? &amp;quot;unknown&amp;quot; : description;
            metadata[&amp;quot;Tags&amp;quot;] = String.IsNullOrEmpty(tags) ? &amp;quot;unknown&amp;quot; : tags;

            // Add and commit metadata to blob
            blob.Metadata.Add(metadata);
            blob.UploadByteArray(data);

        }

        private void GravarThumbAzureBlob(string id, string name, string description, string tags, string fileName, string contentType, Stream 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[&amp;quot;Id&amp;quot;] = id;
            metadata[&amp;quot;Filename&amp;quot;] = fileName;
            metadata[&amp;quot;ImageName&amp;quot;] = String.IsNullOrEmpty(name) ? &amp;quot;unknown&amp;quot; : name;
            metadata[&amp;quot;Description&amp;quot;] = String.IsNullOrEmpty(description) ? &amp;quot;unknown&amp;quot; : description;
            metadata[&amp;quot;Tags&amp;quot;] = String.IsNullOrEmpty(tags) ? &amp;quot;unknown&amp;quot; : tags;

            // Add and commit metadata to blob
            blob.Metadata.Add(metadata);
            blob.UploadFromStream(data);
        } &amp;nbsp; 6.4. Procure a fun&#231;&#227;o ProductAddBtn_Click e dentro do bloco Try, comente as chamadas das fun&#231;&#245;es GravarImagemFileSystem e GravarThumbFileSystem e inclua o c&#243;digo abaixo das fun&#231;&#245;es previamente comentadas.&amp;nbsp; GravarImagemAzureBlob(
                        Guid.NewGuid().ToString(),
                        imageName,
                        HttpUtility.HtmlEncode(Description.Text),
                        &amp;quot;&amp;quot;,
                        imageName,
                        FileUpload1.PostedFile.ContentType,
                        FileUpload1.FileBytes);

      ////c&#243;digo para gravar imagem thumbnail no File System
                    GravarThumbAzureBlob(
                         Guid.NewGuid().ToString(),
                         imageName,
                         HttpUtility.HtmlEncode(Description.Text),
                         &amp;quot;&amp;quot;,
                         imageName,
                         FileUpload1.PostedFile.ContentType,
                         CreateThumbnail(FileUpload1.FileContent)); &amp;nbsp;7. Analise o c&#243;digo&amp;nbsp;apresentado e em caso de d&#250;vida, inclua um coment&#225;rio no artigo. 8. Abra o arquivo ProductDetails.aspx e altere o src do objeto Image para acessar as&amp;nbsp;imagens do servi&#231;o de Blog que voc&#234; criou no passo anterior. Fa&#231;a os&amp;nbsp;seguintes passos, posicione o cursor na linha 12 logo abaixo de. &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt; Troque a linha &amp;nbsp;
&amp;lt;img src=&#39;Catalog/Images/&amp;lt;%# Eval(&amp;quot;ProductImage&amp;quot;) %&amp;gt;&#39;  border=&amp;quot;0&amp;quot; alt=&#39;&amp;lt;%# Eval(&amp;quot;ModelName&amp;quot;) %&amp;gt;&#39; /&amp;gt;
 Por essa abaixo &amp;nbsp;
&amp;lt;img src=&#39;https://[suacontadestorage].blob.core.windows.net/gallery/&amp;lt;%# Eval(&amp;quot;ProductImage&amp;quot;) %&amp;gt;&#39;  border=&amp;quot;0&amp;quot; alt=&#39;&amp;lt;%# Eval(&amp;quot;ModelName&amp;quot;) %&amp;gt;&#39; /&amp;gt;
 9. Por fim, abra o&amp;nbsp;&amp;nbsp;arquivo ProductsList.aspx e altere o src do objeto Image para acessar as imagens do servi&#231;o de Blog, da mesma forma que o passo anterior.&amp;nbsp;Posicione o cursor na linha 16, logo abaixo de. 
&amp;lt;a href=&#39;ProductDetails.aspx?productID=&amp;lt;%# Eval(&amp;quot;ProductID&amp;quot;) %&amp;gt;&#39;&amp;gt;
  Em seguida, troque a linha. 
&amp;lt;image src=&#39;Catalog/Images/Thumbs/&amp;lt;%# Eval(&amp;quot;ProductImage&amp;quot;) %&amp;gt;&#39; width=&amp;quot;100&amp;quot; height=&amp;quot;75&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;
 Pela seguinte linha. 
&amp;lt;image src=&#39;https://[suacontadestorage].blob.core.windows.net/gallery/&amp;lt;%# Eval(&amp;quot;ProductImage&amp;quot;) %&amp;gt;&#39; width=&amp;quot;100&amp;quot; height=&amp;quot;75&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;
&amp;nbsp; Obs: troque [suacontadestorage] pelo nome da conta de storage que voc&#234; criou anteriormente. 10. Neste momento a&amp;nbsp;aplica&#231;&#227;o j&#225; est&#225; preparada para usar o servi&#231;o de Blob do Windows Azure e armazenar as imagens da aplica&#231;&#227;o. Para testar basta pressionar &amp;lt;F5&amp;gt; no&amp;nbsp;Visual Studio, acesse a p&#225;gina ProductAdd.aspx e cadastre um novo produto. Em seguida volte para a lista de produtos e verifique se o novo produto est&#225; aparecendo. Para finalizar o teste clique no detalhes do produto e para&amp;nbsp;verificar&amp;nbsp;que a imagem est&#225; dentro do servi&#231;o de Blob, basta clicar com o bot&#227;o direito do mouse na imagem e ver as propriedades. Para verificar a URI da imagem. Fa&#231;a download do c&#243;digo fonte do projeto alterado, clicando aqui. Esse artigo foi realizado utilizando o Hands-On-Lab criado por Rog&#233;rio Cordeiro. Abra&#231;o,&amp;nbsp; Vin&#237;cius. </description>
	<link></link>
	<language>en</language>
	<pubDate>Wed, 22 May 2013 09:52:39 GMT</pubDate>
	<lastBuildDate>Wed, 22 May 2013 09:52:39 GMT</lastBuildDate>
	<generator>Rev9</generator>
	<item>
		<title>Re: Utilizando o Blob para substituir o file system</title>
		<description>
			<![CDATA[<p>Vinícius,</p><p>No Passo2, item 6 &quot;A primeira alteração é incluir as referências&quot;, não seria necessário garantir que as DLLs Microsoft.WindowsAzure.ServiceRuntime.dll e&nbsp;Microsoft.WindowsAzure.StorageClient.dll sejam integradas ao pacote, através da propriedade &quot;Copy Local&quot; setada comoTrue em ambas referências?</p><p>Abraços.</p><p>posted by EliezerPerlmutter</p>]]>
		</description>
		<link>http://channel9.msdn.com/posts/Utilizando-o-Blob-para-substituir-o-file-system#c634740867722864344</link>
		<pubDate>Thu, 31 May 2012 18:46:12 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/posts/Utilizando-o-Blob-para-substituir-o-file-system#c634740867722864344</guid>
		<dc:creator>EliezerPerlmutter</dc:creator>
	</item>
	<item>
		<title>Re: Utilizando o Blob para substituir o file system</title>
		<description>
			<![CDATA[<p>Pessoal,</p><p>Seguindo com a discussão do Eliezer, eu tive que setar a propriedade &quot;Copy Local&quot; para algumas DLLs. Ex.: System.Web.Razor e System.WebPages.Razor para que as mesmas fossem para &nbsp;o pacote quando eu realiza-se o deploy.</p><p>Porem para o pacote&nbsp;<strong>TailspinSpyworks &nbsp;</strong>eu não necessitei fazer devida alteração.</p><p>Obs.: Estou usando o VS2012 Ultimate Beta.</p><p>posted by mkrypka</p>]]>
		</description>
		<link>http://channel9.msdn.com/posts/Utilizando-o-Blob-para-substituir-o-file-system#c634750699916446996</link>
		<pubDate>Tue, 12 Jun 2012 03:53:11 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/posts/Utilizando-o-Blob-para-substituir-o-file-system#c634750699916446996</guid>
		<dc:creator>mkrypka</dc:creator>
	</item>
	<item>
		<title>Re: Utilizando o Blob para substituir o file system</title>
		<description>
			<![CDATA[<p>Precisa mesmo usar o VS como administrador? Não percebi nenhuma operação que não fosse cotidiana na codificação.</p><p>posted by RLSa</p>]]>
		</description>
		<link>http://channel9.msdn.com/posts/Utilizando-o-Blob-para-substituir-o-file-system#c634795297687705002</link>
		<pubDate>Thu, 02 Aug 2012 18:42:48 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/posts/Utilizando-o-Blob-para-substituir-o-file-system#c634795297687705002</guid>
		<dc:creator>RLSa</dc:creator>
	</item>
</channel>
</rss>