Closed jacksonwj closed 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可以看到:
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好!
@AxiosLeo 您好,当前AlibabaCloud.SDK.Oss20190517
不可用,不知您是否可以提供修复或帮忙反馈?
@LeaFrock 好的。我帮你反馈下这个问题。
收到反馈,会近期支持。
OSS SDK已更新
@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));
}
不管是 ListBucketsAsync
还是 ListBucketsWithOptionsAsync
,都会报相同的异常。
@LeaFrock 麻烦再帮忙反馈一下,好像还是不行。
@yndu13 似乎又是model转换的问题,类似#9 。
@jacksonwj 建议另开issue。不过感觉阿里云对.NET SDK不是很上心,如果着急的话建议走阿里云工单进行反馈或者投诉。
@LeaFrock 感谢
对于 OSS 的操作,现在使用的是
Aliyun.OSS.SDK.NetCore
,偶然看到还有一个AlibabaCloud.SDK.Oss20190517
的 SDK。添加到项目内,调用方法
ListBucketsAsync(req)
,抛出异常:The method or operation is not implemented
。请问,这个 SDK
AlibabaCloud.SDK.Oss20190517
还没有实现完毕吗?