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