Invalidar/apagar arquivos no CloudFront da Amazon em ASP.NET C#

segunda-feira, 15 agosto 2011 17:07 por leolima77

Estamos trabalhando com o CDN da Amazon, o CloudFront, serviço de distribuição de informação que permite fornecer conteúdo web de uma forma mais rápida a um grande número de usuários, distribuindo o conteúdo por vários servidores espalhados pelo mundo, duplicando e direcionando o usuário ao servidor mais próximo a sua localidade. Depois de ver o ganho absurdo de performance, vemos as desvantagens que ele proporciona, lógicamente mínimas perto dos ganhos, e aliás, só existe uma desvantagem, a atualização de algum arquivo no cache.

Usaremos 2 métodos, um que inválida o arquivo e outro que trata a data para o padrão que a Amazon exige.

public void InvalidateContent(string distributionId, string fileName)
        {
            try
            {
                string AWSSecretAccessKey = SEU_AWS_SECRET_ACCESS;
                string AWSAccessKeyId = SEU_AWS_ACCESS_KEY;

                string httpDate = GetHttpDate();

                ASCIIEncoding encoding = new ASCIIEncoding();
                string postData = @"<InvalidationBatch>" +
                                    "   <Path>/" + fileName + "</Path>" +
                                    "   <CallerReference>" + httpDate + "</CallerReference>" +
                                    "</InvalidationBatch>";
                byte[] data = encoding.GetBytes(postData);

                // Prepare web request...
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://cloudfront.amazonaws.com/2010-08-01/distribution/" + distributionId + "/invalidation");
                webRequest.Method = "POST";
                webRequest.ContentType = "text/xml";
                webRequest.Headers.Add("x-amz-date", httpDate);

                Encoding ae = new UTF8Encoding();
                HMACSHA1 signature = new HMACSHA1(ae.GetBytes(AWSSecretAccessKey.ToCharArray()));
                string b64 = Convert.ToBase64String(signature.ComputeHash(ae.GetBytes(webRequest.Headers["x-amz-date"].ToCharArray())));
                string auth = "AWS" + " " + AWSAccessKeyId + ":" + b64;
                webRequest.Headers.Add(HttpRequestHeader.Authorization, auth);

                webRequest.ContentLength = data.Length;

                Stream newStream = webRequest.GetRequestStream();
                // Send the data.
                newStream.Write(data, 0, data.Length);

                newStream.Close();
            }
            catch
            {

            }
        }

        /// <summary>
        /// Gets a proper HTTP date
        /// </summary>
        public static string GetHttpDate()
        {
            // Setting the Culture will ensure we get a proper HTTP Date.
            string date = System.DateTime.UtcNow.ToString("ddd, dd MMM yyyy HH:mm:ss ", System.Globalization.CultureInfo.InvariantCulture) + "GMT";
            return date;
        }

 

Modo usar:

protected void Page_Load(object sender, EventArgs e)
        {
                InvalidateContent(DISTRIBUTION_ID, CAMINHO_DO_ARQUIVO);
        }

Dúvidas entrem em contato.

abs

Tags:   , , , , , ,
Categorias:   Dicas
Ferramentas:   E-mail | del.icio.us | digg | rec6 | linkk | Permalink