public static string ComposeUrl(string endpoint, Dictionary <string, string> queries, string protocol)
        {
            Dictionary <string, string> mapQueries = queries;
            StringBuilder urlBuilder = new StringBuilder("");

            urlBuilder.Append(protocol);
            urlBuilder.Append("://").Append(endpoint);
            urlBuilder.Append("/?");
            StringBuilder builder = new StringBuilder("");

            foreach (var entry in mapQueries)
            {
                String key = entry.Key;
                String val = entry.Value;
                if (val == null)
                {
                    continue;
                }
                builder.Append(AcsURLEncoder.Encode(key));
                builder.Append("=").Append(AcsURLEncoder.Encode(val));
                builder.Append("&");
            }
            int strIndex = builder.Length;

            builder.Remove(strIndex - 1, 1);
            string query = builder.ToString();

            return(urlBuilder.Append(query).ToString());
        }
        public static string ComposeStringToSign(MethodType method, Dictionary <string, string> queries)
        {
            IDictionary <string, string> sortedDictionary =
                new SortedDictionary <string, string>(queries, StringComparer.Ordinal);

            var canonicalizedQueryString = new StringBuilder();

            foreach (var p in sortedDictionary)
            {
                canonicalizedQueryString.Append("&")
                .Append(AcsURLEncoder.PercentEncode(p.Key)).Append("=")
                .Append(AcsURLEncoder.PercentEncode(p.Value));
            }

            var stringToSign = new StringBuilder();

            stringToSign.Append(method.ToString());
            stringToSign.Append(Separator);
            stringToSign.Append(AcsURLEncoder.PercentEncode("/"));
            stringToSign.Append(Separator);
            stringToSign.Append(AcsURLEncoder.PercentEncode(
                                    canonicalizedQueryString.ToString().Substring(1)));

            return(stringToSign.ToString());
        }