aliyun / alibabacloud-csharp-sdk

59 stars 32 forks source link

AlibabaCloud.SDK.Oss20190517 不能使用吗? #7

Closed jacksonwj closed 2 years ago

jacksonwj commented 2 years ago

对于 OSS 的操作,现在使用的是 Aliyun.OSS.SDK.NetCore,偶然看到还有一个 AlibabaCloud.SDK.Oss20190517 的 SDK。

添加到项目内,调用方法 ListBucketsAsync(req),抛出异常:The method or operation is not implemented

请问,这个 SDK AlibabaCloud.SDK.Oss20190517 还没有实现完毕吗?

jacksonwj commented 2 years ago

异常

LeaFrock commented 2 years ago

这么大的问题,居然还不处理。

我怀疑问题出在这里:

1、AlibabaCloud.SDK.Oss20190517.Client继承了AlibabaCloud.OpenApiClient。初看堆栈,是执行父类ExecuteAsync时报错,但因为这里非常粗暴地throw了异常,导致堆栈截断,看不到进一步的信息。

2、进一步分析源码,发现AlibabaCloud.SDK.Oss20190517.Client里包装了AlibabaCloud.GatewaySpi.Client,这是一个父类,里面的方法全部是throw new NotImplementedException()。不知道为什么不干脆写成抽象类?

3、实际在AlibabaCloud.SDK.Oss20190517.Client的构造函数中,初始化的是AlibabaCloud.GatewayOss.Client。代码如下:

        protected AlibabaCloud.GatewaySpi.Client _client;

        public Client(AlibabaCloud.OpenApiClient.Models.Config config): base(config)
        {
            this._client = new AlibabaCloud.GatewayOss.Client();
            this._spi = _client;
            this._endpointRule = "";
        }

最骚的操作来了:在AlibabaCloud.GatewayOss.Client类里,直接复制了父类的几个同名方法然后添加了具体实现……只有继承,并没有重载方法实现多态。这导致编译器使用new关键词覆盖了父类的各种方法,在Nuget包AlibabaCloud.GatewayOss目前最新版本0.0.3.0可以看到: 1658827202828

4、综上,在ExecuteAsync方法中,会调用到GatewaySpi.Client里的方法,而SDK开发者误以为赋值GatewayOss.Client就可以实现多态,事实上仍然只会调用父类里的方法:throw new NotImplementedException()。找个初级C#开发者,都不至于犯这种错误,阿里这么强大的开发团队,我只能怀疑是typo了。建议将GatewaySpi.Client改为abstract类,在GatewayOss.Client里override所有方法提供具体的实现。

5、希望尽快修复AlibabaCloud.SDK.Oss20190517包!至少该SDK基于HttpClient和异步API,并且底层还用ConcurrentDictionary自己实现了一个HttpClient池。想法是好的,虽然代码质量不敢恭维,但至少比原先那套SDK好!

LeaFrock commented 2 years ago

@AxiosLeo 您好,当前AlibabaCloud.SDK.Oss20190517不可用,不知您是否可以提供修复或帮忙反馈?

AxiosLeo commented 2 years ago

@LeaFrock 好的。我帮你反馈下这个问题。

yndu13 commented 2 years ago

收到反馈,会近期支持。

yndu13 commented 2 years ago

OSS SDK已更新

jacksonwj commented 2 years ago

@yndu13 好像还是有问题

调用方法,如下所示:

using Oss = AlibabaCloud.SDK.Oss20190517;

var ossCfg = new Config
{
    AccessKeyId = <Key>,
    AccessKeySecret = <Secret>,
    Endpoint = "oss-cn-hangzhou.aliyuncs.com"
};

var cli = new Oss.Client(ossCfg);

var req = new Oss.Models.ListBucketsRequest
{
    MaxKeys = 500
};

try
{
    // var result = await cli.ListBucketsAsync(req);
    var result = await cli.ListBucketsWithOptionsAsync(req, new Dictionary<string, string>(), new RuntimeOptions());
    if (result == null || result.Body == null || result.Body.Buckets == null ||
        result.Body.Buckets.Buckets == null || result.Body.Buckets.Buckets.Count == 0)
    {
        return new(code: 400, msg: "暂无 Bucket");
    }

    return new(result.Body.Buckets.Buckets, result.Body.Buckets.Buckets.Count);
}
catch (TeaException e)
{
    return new(code: 500, msg: Common.AssertAsString(e.Message));
}
catch (Exception e)
{
    var ex = new TeaException(new Dictionary<string, string>
    {
        { "message", e.Message }
    });

    return new(code: 500, msg: Common.AssertAsString(ex.Message));
}

异常如下图所示:

Exception.Message

Exception.StackTrace

不管是 ListBucketsAsync 还是 ListBucketsWithOptionsAsync,都会报相同的异常。

jacksonwj commented 2 years ago

@LeaFrock 麻烦再帮忙反馈一下,好像还是不行。

LeaFrock commented 2 years ago

@yndu13 似乎又是model转换的问题,类似#9 。

@jacksonwj 建议另开issue。不过感觉阿里云对.NET SDK不是很上心,如果着急的话建议走阿里云工单进行反馈或者投诉。

jacksonwj commented 2 years ago

@LeaFrock 感谢