/// <summary>
        /// 获取添加密钥签名后的查询字符串。
        /// </summary>
        /// <param name="uri"></param>
        /// <param name="accessKeyStorage">AccessKeyId / AccessKeySecret 存储器。</param>
        /// <param name="algorithmName">签名 HMAC 哈希算法名称。</param>
        /// <returns></returns>
        public static string GetKeyedSignedQueryString(Uri uri, IAccessKeyStorage accessKeyStorage, string algorithmName)
        {
            if (accessKeyStorage == null)
            {
                throw new ArgumentNullException(nameof(accessKeyStorage));
            }

            IDictionary <string, string> sortedQueryStrings = GetSortedQueries(uri);

            if (!sortedQueryStrings.ContainsKey(QUERY_NAME_ACCESSKEYID))
            {
                throw new InvalidOperationException("AccessKeyId field is not found.");
            }

            string accessKeyId     = sortedQueryStrings[QUERY_NAME_ACCESSKEYID];
            string accessKeySecret = accessKeyStorage.GetAccessKeySecret(accessKeyId);

            return(GetKeyedSignedQueryString(uri, accessKeyId, accessKeySecret, algorithmName));
        }
 public static IHttpClientBuilder UseKeyedQuerySignatureInterceptor(this IHttpClientBuilder httpClientBuilder, IAccessKeyStorage accessKeyStorage, string algorithmName = "HMACSHA1")
 {
     return(httpClientBuilder.AddRequestInterceptor(request =>
     {
         request.RequestUri = UriHelper.GetRelativeUri(request.RequestUri, string.Empty, (builder) =>
         {
             builder.Query = QuerySignatureHelper.GetKeyedSignedQueryString(builder.Uri, accessKeyStorage, algorithmName);
         });
     }));
 }