The following code is using the Amazon Alexa Web Information Service to pull site information. You create the url, with query strings, and sign the request.
string awsAccessId = "MyAccessId";
string awsSecretKey = "MySecretKey";
string alexaUrl = "http://awis.amazonaws.com/?";
Dictionary<string, string> queryStringList = new Dictionary<string, string>();
string timeStamp = System.DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ", System.Globalization.CultureInfo.InvariantCulture);
queryStringList.Add("Url", "google.com");
queryStringList.Add("Action", "UrlInfo");
queryStringList.Add("Count", "10");
queryStringList.Add("ResponseGroup", "Rank,ContactInfo,Categories,UsageStats,Keywords,SiteData,LinksInCount");
queryStringList.Add("SignatureMethod", "HmacSHA256");
queryStringList.Add("SignatureVersion", "2");
queryStringList.Add("Start", "1");
queryStringList.Add("Timestamp", timeStamp);
//sort
queryStringList = queryStringList.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
//query strings must be urlencode with special characters being in uppercase, .NET does not do this by default
//must use custom method
//access key must be first in the query string
string queryString = "";
queryString = "AWSAccessKeyId=" + UpperCaseUrlEncode(awsAccessId) + "&";
//url encode query string values
foreach (var item in queryStringList)
{
queryString += item.Key + "=" + UpperCaseUrlEncode(item.Value) + "&";
}
//remove trailing &
queryString = queryString.TrimEnd(new char[] { '&' });
alexaUrl += queryString;
//must create signature
string stringToEncode = "GET\nawis.amazonaws.com\n/\n" + queryString;
System.Security.Cryptography.HMACSHA256 provider = new System.Security.Cryptography.HMACSHA256(System.Text.Encoding.UTF8.GetBytes(awsSecretKey));
byte[] tmpSource;
byte[] tmpHash;
//Create a byte array from source data.
tmpSource = System.Text.Encoding.UTF8.GetBytes(stringToEncode);
//Compute hash based on source data.
tmpHash = provider.ComputeHash(tmpSource);
//Convert hash to string
string endcodeQueryString = Convert.ToBase64String(tmpHash, 0, tmpHash.Length);
alexaUrl += "&Signature=" + Server.UrlEncode(endcodeQueryString);
...
//method to url encode a value with uppercase values for special characters
public static string UpperCaseUrlEncode(string value)
{
char[] temp = HttpUtility.UrlEncode(value).ToCharArray();
for (int i = 0; i < temp.Length - 2; i++)
{
if (temp[i] == '%')
{
temp[i + 1] = char.ToUpper(temp[i + 1]);
temp[i + 2] = char.ToUpper(temp[i + 2]);
}
}
return new string(temp);
}