开发者

Amazon CloudFront invalidation in ASP.Net

开发者 https://www.devze.com 2023-01-15 03:42 出处:网络
I am not sure how to send a request using ASP.Net to Amazon CloudFront to invalidate an object. The details are here http://docs.amazonwebservices.com/Ama开发者_如何学GozonCloudFront/latest/Developer

I am not sure how to send a request using ASP.Net to Amazon CloudFront to invalidate an object.

The details are here http://docs.amazonwebservices.com/Ama开发者_如何学GozonCloudFront/latest/DeveloperGuide/index.html?Invalidation.html but I am not sure how to implement this in ASP.Net... can someone please help?


The accepted answer no longer works as of the latest version of the AWS SDK for .NET (1.5.8.0). This should do the trick:

using Amazon;
using Amazon.CloudFront.Model;

...

var client = AWSClientFactory.CreateAmazonCloudFrontClient(accessKey, secretKey);
client.CreateInvalidation(new CreateInvalidationRequest {
    DistributionId = distributionID,
    InvalidationBatch = new InvalidationBatch {
        Paths = new Paths {
            Quantity = arrayofpaths.Length,
            Items = arrayofpaths.ToList()
        },
        CallerReference = DateTime.Now.Ticks.ToString()
    }
});


Got it working, here it is if anyone else finds it useful.

    public static void InvalidateContent(string distributionId, string fileName)
    {
        string httpDate = Helpers.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(GlobalSettings.AWSSecretAccessKey.ToCharArray()));
        string b64 = Convert.ToBase64String(signature.ComputeHash(ae.GetBytes(webRequest.Headers["x-amz-date"].ToCharArray())));
        webRequest.Headers.Add(HttpRequestHeader.Authorization, "AWS" + " " + GlobalSettings.AWSAccessKeyId + ":" + b64);

        webRequest.ContentLength = data.Length;

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

    /// <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;
    }


Here's a python version of the above, if anyone finds it useful

from datetime import datetime
import urllib2, base64, hmac, hashlib

def getHTTPDate():
    return datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S UTC")

def submitInvalidationRequest(fileName,distributionId):
    url = "https://cloudfront.amazonaws.com/2010-08-01/distribution/" + distributionId + "/invalidation"
    httpDate = getHTTPDate();
    postData = "<InvalidationBatch>" +"<Path>/" + fileName + "</Path>" +"<CallerReference>" + httpDate + "</CallerReference>" +"</InvalidationBatch>";
    sig = hmac.new(AWSSecretAccessKey, unicode(httpDate), hashlib.sha1)

    headers = {"ContentType": "text/xml",
           "x-amz-date": httpDate,
           "Authorization":"AWS " + AWSAccessKeyId + ":" +  base64.b64encode( sig.digest() )}

    req = urllib2.Request(url,postData,headers)
    return urllib2.urlopen(req).read()


using the AWSSDK .net api wrapper from amazon makes this task even easier.

using Amazon.CloudFront.Model;

...

var client = Amazon.AWSClientFactory.CreateAmazonCloudFrontClient(ConfigurationManager.AppSettings["Aws.AccessKey"],
                                                              ConfigurationManager.AppSettings["Aws.SecretKey"]);
var request = new PostInvalidationRequest();
request.DistributionId = ConfigurationManager.AppSettings["Cdn.DistributionId"];
request.InvalidationBatch = new InvalidationBatch();
request.InvalidationBatch.CallerReference = new Guid().ToString();
request.InvalidationBatch.Paths = PathsInput.Text.Split(new[]{'\n','\r'},StringSplitOptions.RemoveEmptyEntries).ToList();
var response = client.PostInvalidation(request);


Here's perl:

use warnings;
use strict;
use HTTP::Date;
use Digest::SHA qw(hmac_sha1);
use LWP::UserAgent;
use MIME::Base64;
use Encode qw(encode_utf8);

@ARGV == 4 || die "usage: $0 url distribution_id accesskey secretkey\n";

my $invalid_url = $ARGV[0];
my $distribution_id = $ARGV[1];
my $accesskey = $ARGV[2];
my $secretkey = $ARGV[3];

my $url = "https://cloudfront.amazonaws.com/2010-11-01/distribution/$distribution_id/invalidation";
my $date = time2str;

my $post_data = <<HERE;
<?xml version="1.0" encoding="UTF-8"?>
<InvalidationBatch>
  <Path>$invalid_url</Path>
  <CallerReference>$date</CallerReference>
</InvalidationBatch>
HERE

my $sig = encode_base64(hmac_sha1(encode_utf8($date),encode_utf8($secretkey)));

my $browser = LWP::UserAgent->new;
my $res = $browser->post($url,
                         "Content" => $post_data,
                         "ContentType" => "text/xml",
                         "x-amz-date" => $date,
                         "Authorization" => "AWS $accesskey:$sig");

print $res->status_line, "\n", $res->content;
0

精彩评论

暂无评论...
验证码 换一张
取 消