GetEndpointForService() public method

Gets the endpoint for a service in a region.
Thrown when the request service does not have a valid endpoint in the region.
public GetEndpointForService ( string serviceName ) : Endpoint
serviceName string The services system name.
return Endpoint
 public AmazonS3Region(RegionEndpoint region)
 {
     Name = region.DisplayName;
     Identifier = region.SystemName;
     AmazonRegion = region;
     Hostname = region.GetEndpointForService("s3").Hostname;
 }
Beispiel #2
0
        /// <summary>
        /// 生成签名(带自定义查询字符串)
        /// @wHaibo
        /// </summary>
        /// <param name="bucketName"></param>
        /// <param name="fileKey"></param>
        /// <param name="qs"></param>
        /// <param name="expires"></param>
        /// <returns></returns>
        static string SignURL(string bucketName, string fileKey, NameValueCollection qs, TimeSpan expires)
        {
            Amazon.Runtime.BasicAWSCredentials cred = new Amazon.Runtime.BasicAWSCredentials(strAccessKey, strSecretKey);
            Amazon.RegionEndpoint endpoint          = Amazon.RegionEndpoint.CNNorth1;
            //Amazon.RegionEndpoint endpoint = Amazon.RegionEndpoint.APNortheast1;
            string host = endpoint.GetEndpointForService(bucketName + ".s3").Hostname;

            string method = "GET";
            string fk     = fileKey.Replace("/", "_XXXX_");
            string uri    = "/" + System.Uri.EscapeDataString(fk);

            uri = uri.Replace("_XXXX_", "/");
            Console.WriteLine(uri);

            DateTime dt               = DateTime.Now.ToUniversalTime();
            string   algorithm        = "AWS4-HMAC-SHA256";
            string   amz_date         = dt.ToString("yyyyMMddTHHmmss") + "Z";
            string   datestamp        = dt.ToString("yyyyMMdd");
            string   credential_scope = datestamp + "/" + endpoint.SystemName + "/s3/" + "aws4_request";

            NameValueCollection queryString = new NameValueCollection();

            if (qs != null && qs.Count > 0)
            {
                queryString.Add(qs);
            }
            queryString.Add("X-Amz-Algorithm", algorithm);
            queryString.Add("X-Amz-Credential", String.Format("{0}/{1}",
                                                              strAccessKey, credential_scope));
            queryString.Add("X-Amz-Date", amz_date);
            queryString.Add("X-Amz-Expires", Math.Round(expires.TotalSeconds, 0).ToString());
            queryString.Add("X-Amz-SignedHeaders", "host");

            List <String> kl = queryString.AllKeys.OrderBy(x => new StringAsciiCompare(WebUtility.UrlEncode(x))).ToList();
            StringBuilder sb = new StringBuilder();

            foreach (string k in kl)
            {
                if (sb.Length > 0)
                {
                    sb.Append("&");
                }
                sb.Append(WebUtility.UrlEncode(k)).Append("=");
                if (!String.IsNullOrEmpty(queryString[k]))
                {
                    sb.Append(WebUtility.UrlEncode(queryString[k]));
                }
            }


            string canonical_headers = "host:" + host + '\n';
            string signed_headers    = "host";
            string canonical_request = method + '\n' + uri + '\n' + sb.ToString() + '\n' + canonical_headers + '\n' + signed_headers + '\n' + "UNSIGNED-PAYLOAD";

            Console.WriteLine(canonical_request);
            string string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + sha256(canonical_request);



            byte[] signing_key = getSignatureKey(strSecretKey, datestamp, endpoint.SystemName, "s3");

            string signature = BitConverter.ToString(HmacSHA256(string_to_sign, signing_key)).Replace("-", "").ToLower();


            string url = "http://" + host + uri + "?" + sb.ToString() + "&X-Amz-Signature=" + signature;

            return(url);
        }