/// <summary>
        /// 对一个请求计算前面并放入header中
        /// </summary>
        /// <param name="serviceRequest"></param>
        /// <param name="credential"></param>
        public static void SignRequest(ServiceRequest serviceRequest, OssCredential credential, HttpRequestMessage httpRequestMessage)
        {
            string httpMethod  = serviceRequest.HttpMethod.Method.ToUpperInvariant();
            string contentType = httpRequestMessage.Content?.Headers.ContentType?.ToString();
            string date        = serviceRequest.Headers[HttpHeaders.Date];
            string contentMd5  = serviceRequest.ContentMd5 == null ? "" : Convert.ToBase64String(serviceRequest.ContentMd5);
            string ossHeaders  = ComputeCanonicalizedOSSHeaders(serviceRequest.Headers, serviceRequest.Parameters);


            string resourcePath = BuildCanonicalizedResource(serviceRequest.Bucket, serviceRequest.ObjectKey, serviceRequest.Parameters);

            var sign = HmacSha1Sign(credential.AccessKeySecret, httpMethod, contentMd5, contentType, date, ossHeaders,
                                    resourcePath);

            httpRequestMessage.Headers.Add(HttpHeaders.Authorization, "OSS " + credential.AccessKeyId + ":" + sign);
        }
 public OssClient(OssCredential credential, ClientConfiguration config)
 {
     _requestContext = new RequestContext(credential, config);
 }
 public RequestContext(OssCredential credential, ClientConfiguration config)
 {
     OssCredential       = credential;
     ClientConfiguration = config;
 }
 public OssClient(OssCredential credential)
     : this(credential, ClientConfiguration.Default)
 {
 }
        internal static string Region = OssRegions.ShangHai; //设置要操作的区域



        public static async Task RunAsync()
        {
            var crediential = new OssCredential()
            {
                AccessKeyId     = AccessKeyId,
                AccessKeySecret = AssessSecret
            };

            var client = new OssClient(crediential);

            ////list buckets
            //var listBucketResult = await client.ListBucketsAsync(OssRegions.ShangHai);
            //Console.WriteLine(listBucketResult.IsSuccess + ":" + listBucketResult.ErrorMessage);

            var bucket = BucketInfo.CreateByRegion(Region, BucketName, false, false);

            // put string
            {
                string content   = "这是一个文本文件\naaaaaaaa\nbbbbbb\nccccccccc";
                var    putResult = await client.PutObjectAsync(bucket, "test_put_object_string.txt", content);

                Console.WriteLine($"Put string object  {putResult.IsSuccess} {putResult.ErrorMessage}  Etag:{putResult.SuccessResult?.ETag}");
            }



            // put file
            {
                var file      = @"D:\Work\Weixin\resource\IMG_1399.png";
                var putResult = await client.PutObjectByFileNameAsync(bucket, "test_put_file.png", file);

                Console.WriteLine($"Put file object  {putResult.IsSuccess} {putResult.ErrorMessage}  Etag:{putResult.SuccessResult?.ETag}");
            }

            //// copy file
            //Console.WriteLine("\n\n===Copy Object=============");
            //var copyResult =
            //    await
            //        client.CopyObjectAsync(bucket, "test_put_object_string.txt", bucket,
            //            "test_03_copy_object_string.txt", null);
            //Console.WriteLine($"Copy object  {copyResult.IsSuccess} {copyResult.ErrorMessage}  Etag:{copyResult.SuccessResult?.LastModified}");

            //// get file
            //Console.WriteLine("\n\n===Get Object=============");
            //var getResult = await client.GetObjectAsync(bucket, "test_put_object_string.txt");
            //Console.WriteLine($"Get Object = {getResult.IsSuccess}");
            //if (getResult.IsSuccess)
            //{
            //    var content = await getResult.SuccessResult.Content.ReadAsStringAsync();
            //    Console.WriteLine("FileContent" + content);
            //}

            //// append file
            //Console.WriteLine("\n\n===append Object=============");
            //{
            //    var content = "This is a line 这是一行字符串.";
            //    var file = new OssObjectInfo()
            //    {
            //        ContentType = RequestContentType.String,
            //        MimeType = "text/text",
            //        StringContent = content
            //    };
            //    var appendResult = await client.AppendObject(bucket, "test_append_object.txt", 0, file);
            //    Console.WriteLine($"1st append:{appendResult.IsSuccess} nextPos={appendResult.SuccessResult?.NextAppendPosition}");
            //    if (appendResult.IsSuccess)
            //    {
            //        appendResult = await client.AppendObject(bucket, "test_append_object.txt", appendResult.SuccessResult.NextAppendPosition, file);
            //        Console.WriteLine($"2st append:{appendResult.IsSuccess} nextPos={appendResult.SuccessResult?.NextAppendPosition}");

            //    }
            //}

            //// delete object
            //Console.WriteLine("\n\n===append Object=============");
            //{
            //    var content = "This is a line 这是一行字符串.";
            //    var key = "test_delete_object.txt";
            //    var putResult = await client.PutObjectAsync(bucket, key, content);
            //    if (putResult.IsSuccess)
            //    {
            //        var deleteResult = await client.DeleteObjectAsync(bucket, key);
            //        Console.WriteLine($"Delete reuslt:{deleteResult.IsSuccess} {deleteResult.ErrorMessage}");
            //    }
            //    else
            //    {
            //        Console.WriteLine($" Put object failed.{putResult.ErrorMessage}");
            //    }
            //}

            //// delete multiple
            //Console.WriteLine("\n\n===delete multiple=============");
            //{
            //    var content = "This is a line 这是一行字符串.";

            //    IList<string> fielKeys = new List<string>();

            //    for (int i = 1; i < 10; i++)
            //    {
            //        var key = $"test_delete_multi_object_{i}.txt";
            //        var putResult = await client.PutObjectAsync(bucket, key, content);
            //        if (putResult.IsSuccess == false)
            //        {
            //            Console.WriteLine($" Put object {i} failed.{putResult.ErrorMessage}");
            //            return;
            //        }
            //        fielKeys.Add(key);
            //    }

            //    var deleteResult = await client.DeleteMultipleObjectsAsync(bucket, fielKeys, false);

            //    Console.WriteLine($"Delete multi:{deleteResult.IsSuccess} {deleteResult.ErrorMessage}");

            //}


            // head object
            // delete multiple
            Console.WriteLine("\n\n===head object=============");
            {
                var content = "This is a line 这是一行字符串.";
                var key     = "test_head_object.txt";
                //var putResult = await client.PutObjectAsync(bucket, key, content);
                //if (putResult.IsSuccess)
                {
                    var headResult = await client.HeadObjectAsync(bucket, key, null);

                    Console.WriteLine($"Head object: {headResult.IsSuccess} {headResult.ErrorMessage}");
                }
            }


            Console.WriteLine("\n\n===Get object meta=============");
            {
                //var content = "This is a line 这是一行字符串.";
                var key = "test_get_meta_object.txt";
                //var putResult = await client.PutObjectAsync(bucket, key, content);
                //if (putResult.IsSuccess)
                {
                    var headResult = await client.GetObjectMetaAsync(bucket, key);

                    Console.WriteLine($"Head object: {headResult.IsSuccess} {headResult.ErrorMessage}");
                }
            }
        }