这可能是因为缺少AWS签名,需要在HttpClient的请求头中添加签名信息。以下是实现此操作的示例代码:
using Amazon;
using Amazon.CloudFront;
using Amazon.CloudFront.Model;
using Amazon.Runtime;
// ... other code ...
void CallCloudFrontApiWithHttpClient()
{
var accessKey = "your_aws_access_key";
var secretKey = "your_aws_secret_key";
var distributionId = "your_cloudfront_distribution_id";
var resourceKey = "your_resource_key";
var client = new HttpClient();
var sigHandler = new AWS4SignHandler(accessKey, secretKey, RegionEndpoint.USEast1);
var signedHeaders = sigHandler.SignHeaders(new Uri($"http://{distributionId}.cloudfront.net/{resourceKey}"), "GET");
foreach (var header in signedHeaders)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
var response = client.GetAsync($"http://{distributionId}.cloudfront.net/{resourceKey}").Result;
var content = response.Content.ReadAsStringAsync().Result;
// ... process response content ...
}
class AWS4SignHandler
{
private readonly string accessKey;
private readonly string secretKey;
private readonly RegionEndpoint region;
private const string algorithm = "AWS4-HMAC-SHA256";
public AWS4SignHandler(string accessKey, string secretKey, RegionEndpoint region)
{
this.accessKey = accessKey;
this.secretKey = secretKey;
this.region = region;
}
public IDictionary SignHeaders(Uri endpointUri, string httpMethod)
{
var nowUtc = DateTime.UtcNow;
var requestHeaders = new Dictionary(StringComparer.OrdinalIgnoreCase);
// Host header is required
requestHeaders.Add("host", endpointUri.Host);
// Date header is required
var dateString = nowUtc.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
requestHeaders.Add("x-amz-date", nowUtc.ToString("yyyyMMddTHHmmssZ", CultureInfo.InvariantCulture));
// Authorization header is required
var canonicalRequest = GetCanonicalRequest(endpointUri, httpMethod, requestHeaders, string.Empty);
var stringToSign = GetStringToSign