aliyun / aliyun-oss-csharp-sdk

Aliyun OSS SDK for C#
MIT License
383 stars 206 forks source link

请添加RestoreObject命令的支持! #23

Closed Roman-Lo closed 5 years ago

Roman-Lo commented 7 years ago

我发现C# SDK里面并没有RestoreObject的命令支持。Java SDK里面已经对该功能有所支持,并且能成功使用。 我也尝试过自己去参照其它指令去实现,发现返回了405 - Method Not Allowed的错误。下面是我的实现方式:

添加RestoreObjectCommand.cs

using System;
using System.Collections.Generic;
using Aliyun.OSS.Common.Communication;
using Aliyun.OSS.Util;

namespace Aliyun.OSS.Commands
{
    internal class RestoreObjectCommand : OssCommand
    {
        public RestoreObjectRequest Request { get; private set; }

        protected override string Key { get { return Request.Key; } }
        protected override string Bucket { get { return Request.BucketName; } }
        protected override HttpMethod Method { get { return HttpMethod.Post; } }

        private RestoreObjectCommand(IServiceClient client, Uri endpoint, ExecutionContext context, RestoreObjectRequest request) : base(client, endpoint, context)
        {
            Request = request;
        }

        public static RestoreObjectCommand Create(IServiceClient client, Uri endpoint,
                                                 ExecutionContext context, RestoreObjectRequest request)
        {
            return new RestoreObjectCommand(client, endpoint, context, request);
        }

        protected override IDictionary<string, string> Parameters
        {
            get
            {
                var parameters = base.Parameters;
                parameters[RequestParameters.SUBRESOURCE_RESTORE] = null;
                return parameters;
            }
        }
    }
}

IOss.cs加入RestoreObject接口

public interface IOss
{
// .... ignore multiple lines ... 
        /// <summary>
        /// 解冻文件<see cref="RestoreObjectResult" />。
        /// </summary>
        /// <param name="bucketName"><see cref="Bucket" />的名称。</param>
        /// <param name="key"><see cref="OssObject.Key" />。</param>
        /// <returns></returns>
        RestoreObjectResult RestoreObject(string bucketName, string key);
// .... ignore multiple lines ... 
}

OssClient.cs里加入RestoreObject接口的实现

public class OssClient : IOss
 {
// .... ignore multiple lines ... 

        public RestoreObjectResult RestoreObject(string bucketName, string key)
        {
            var cmd = RestoreObjectCommand.Create(_serviceClient, _endpoint,
                CreateContext(HttpMethod.Post, bucketName, key),
                new RestoreObjectRequest(bucketName, key));

            var response = cmd.Execute();

            var result = new RestoreObjectResult((int)response.StatusCode);

            return result;
        }
// .... ignore multiple lines ... 
}

希望官方尽快实现这个接口。

huiguangjun commented 5 years ago

RestoreObject 接口已经提供。