2010-09-03 70 views

回答

8

接受的答案不再工作作爲對.NET(1.5.8.0)最新版本的SDK AWS的。這應該做的伎倆:

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() 
    } 
}); 
+2

+1好讓事情保持最新狀態(傷心我的回答沒有任何更多;-) – Myster 2012-11-28 03:56:40

7

得到它的工作,在這裏,如果有人認爲它有用。

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; 
    } 
+1

順便說以下內容會給你同樣的日期格式'DateTime.UtcNow.ToString( 「R」);' – 2010-11-07 03:54:45

4

這裏是上面的Python版本,如果有人發現它有用

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() 
+0

感謝那 - 你很好把它放下。 – user47892 2010-09-22 21:48:02

1

這裏的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

他沒有問perl,是嗎? – Rob 2012-11-20 15:24:21

+0

^^ Rob:他也沒有要求Python(Alex Hofsteede),是嗎? – 2015-03-14 18:41:17

2

使用AWSSDK .net api wrapper from amazon,使這項工作更容易。

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); 
+0

從AWS SDK for .NET的最新更新(版本1.5.8.0)開始,此功能不再有效。我試圖找到替代品,並將其發佈到此處,除非有人能夠打敗我。 :) – 2012-11-16 18:27:02