├── Directory.Build.props ├── src ├── EasyAbp.Abp.TencentCloud.Common │ ├── Models │ │ ├── ICommonResponse.cs │ │ ├── CommonResponse.cs │ │ ├── ICommonRequest.cs │ │ └── CommonRequest.cs │ ├── FodyWeavers.xml │ ├── TencentCommonConsts.cs │ ├── AbpTencentCloudCommonOptions.cs │ ├── DateTimeExtensions.cs │ ├── AbpTencentCloudCommonModule.cs │ ├── Requester │ │ ├── ITencentCloudApiRequester.cs │ │ └── TencentCloudApiRequester.cs │ ├── EasyAbp.Abp.TencentCloud.Common.csproj │ ├── StringExtensions.cs │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.COS │ ├── Infrastructure │ │ ├── ITencentCOSRequester.cs │ │ ├── IObject.cs │ │ ├── IBucket.cs │ │ └── IBucketOperator.cs │ ├── FodyWeavers.xml │ ├── AbpTencentCloudCOSModule.cs │ ├── EasyAbp.Abp.TencentCloud.COS.csproj │ ├── AbpTencentCloudCOSOptions.cs │ ├── FodyWeavers.xsd │ └── QCloudImplement │ │ ├── CosServerWrapObject.cs │ │ └── DefaultBucketOperator.cs ├── EasyAbp.Abp.TencentCloud.CAM │ ├── FodyWeavers.xml │ ├── AbpTencentCloudCAMModule.cs │ ├── AbpTencentCloudCAMOptions.cs │ ├── EasyAbp.Abp.TencentCloud.CAM.csproj │ ├── STS │ │ ├── GetFederationTokenRequest.cs │ │ └── GetFederationTokenResponse.cs │ ├── Infrastructure │ │ └── Policy.cs │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.CDN │ ├── FodyWeavers.xml │ ├── AbpTencentCloudCDNOptions.cs │ ├── AbpTencentCloudCDNModule.cs │ ├── Statistics │ │ └── Model │ │ │ ├── ListTopDataMetrics.cs │ │ │ ├── ListTopDataFilter.cs │ │ │ ├── ListTopDataResponse.cs │ │ │ ├── DescribeCdnDataMetrics.cs │ │ │ ├── DescribeBillingDataResponse.cs │ │ │ ├── DescribeBillingDataRequest.cs │ │ │ ├── DescribeCdnDataResponse.cs │ │ │ ├── ListTopDataRequest.cs │ │ │ └── DescribeCdnDataRequest.cs │ ├── EasyAbp.Abp.TencentCloud.CDN.csproj │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.Cls │ ├── FodyWeavers.xml │ ├── AbpTencentCloudClsModule.cs │ ├── EasyAbp.Abp.TencentCloud.Cls.csproj │ ├── AbpTencentCloudClsOptions.cs │ ├── LogManagement │ │ ├── SearchLog │ │ │ ├── SearchLogResponse.cs │ │ │ └── SearchLogRequest.cs │ │ ├── ClsCommonRequest.cs │ │ └── QcloudClsSignature.cs │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.Sms │ ├── FodyWeavers.xml │ ├── AbpTencentCloudSmsModule.cs │ ├── EasyAbp.Abp.TencentCloud.Sms.csproj │ ├── AbpTencentCloudSmsOptions.cs │ ├── SendSms │ │ ├── SendSmsResponse.cs │ │ └── SendSmsRequest.cs │ ├── SmsTemplates │ │ ├── DescribeSmsTemplateListRequest.cs │ │ └── DescribeSmsTemplateListResponse.cs │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.CloudLive │ ├── FodyWeavers.xml │ ├── DomainManage │ │ └── Model │ │ │ ├── DescribeLiveDomainsResponse.cs │ │ │ └── DescribeLiveDomainsRequest.cs │ ├── AbpTencentCloudCloudLiveModule.cs │ ├── AbpTencentCloudCloudLiveOptions.cs │ ├── EasyAbp.Abp.TencentCloud.CloudLive.csproj │ ├── Statistics │ │ └── Model │ │ │ ├── DescribeLiveStreamPushInfoListRequest.cs │ │ │ ├── DescribeStreamPlayInfoListRequest.cs │ │ │ ├── DescribeStreamPlayInfoListResponse.cs │ │ │ ├── DescribeStreamDayPlayInfoListResponse.cs │ │ │ ├── DescribeStreamDayPlayInfoListRequest.cs │ │ │ └── DescribeLiveStreamPushInfoListResponse.cs │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.CloudMonitor │ ├── FodyWeavers.xml │ ├── AbpTencentCloudCloudMonitorModule.cs │ ├── AbpTencentCloudCloudMonitorOptions.cs │ ├── EasyAbp.Abp.TencentCloud.CloudMonitor.csproj │ ├── FodyWeavers.xsd │ └── BaseMonitor │ │ ├── GetMonitorDataRequest.cs │ │ └── GetMonitorDataResponse.cs └── EasyAbp.Abp.TencentCloud.Captcha │ ├── AbpTencentCloudCaptchaModule.cs │ ├── EasyAbp.Abp.TencentCloud.Captcha.csproj │ ├── AbpTencentCloudCaptchaOptions.cs │ └── VerifyCaptcha │ ├── VerifyCaptchaResponse.cs │ └── VerifyCaptchaRequest.cs ├── test ├── EasyAbp.Abp.TencentCloud.CAM.Tests │ ├── FodyWeavers.xml │ ├── AbpTencentCloudCAMTestsModule.cs │ ├── AbpTencentCloudCAMTestBase.cs │ ├── EasyAbp.Abp.TencentCloud.CAM.Tests.csproj │ ├── FodyWeavers.xsd │ └── STSTests.cs ├── EasyAbp.Abp.TencentCloud.COS.Tests │ ├── FodyWeavers.xml │ ├── AbpTencentCloudCOSTestBase.cs │ ├── AbpTencentCloudCOSTestsModule.cs │ ├── BucketOperatorTests.cs │ ├── EasyAbp.Abp.TencentCloud.COS.Tests.csproj │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.Cls.Tests │ ├── FodyWeavers.xml │ ├── AbpTencentCloudClsTestsModule.cs │ ├── AbpTencentCloudClsTestBase.cs │ ├── LogManagement │ │ └── SearchLogTests.cs │ ├── EasyAbp.Abp.TencentCloud.Cls.Tests.csproj │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.Sms.Tests │ ├── FodyWeavers.xml │ ├── AbpTencentCloudSmsTestsModule.cs │ ├── AbpTencentCloudSmsTestBase.cs │ ├── SendSmsTests.cs │ ├── EasyAbp.Abp.TencentCloud.Sms.Tests.csproj │ ├── DescribeSmsTemplateListTests.cs │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.TestBase │ ├── FodyWeavers.xml │ ├── AbpTencentCloudConsts.cs │ ├── AbpTencentCloudTestBase.cs │ ├── AbpTencentCloudTestBaseModule.cs │ ├── EasyAbp.Abp.TencentCloud.TestBase.csproj │ └── FodyWeavers.xsd ├── EasyAbp.Abp.TencentCloud.CloudLive.Tests │ ├── FodyWeavers.xml │ ├── AbpTencentCloudCloudLiveTestsModule.cs │ ├── DomainManageTests.cs │ ├── AbpTencentCloudCloudLiveTestBase.cs │ ├── EasyAbp.Abp.TencentCloud.CloudLive.Tests.csproj │ ├── FodyWeavers.xsd │ └── StatisticsTests.cs └── EasyAbp.Abp.TencentCloud.CloudMonitor.Tests │ ├── FodyWeavers.xml │ ├── AbpTencentCloudCloudMonitorTestsModule.cs │ ├── AbpTencentCloudCloudMonitorTestBase.cs │ ├── EasyAbp.Abp.TencentCloud.CloudMonitor.Tests.csproj │ ├── FodyWeavers.xsd │ └── GetMonitorDataTests.cs ├── EasyAbp.Abp.TencentCloud.sln.DotSettings ├── LICENSE ├── common.props ├── docs └── README.md ├── .github └── workflows │ ├── publish-docs.yml │ └── publish.yml ├── .gitignore └── EasyAbp.Abp.TencentCloud.sln /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10.0.1 4 | 5 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/Models/ICommonResponse.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.Common.Models 2 | { 3 | public interface ICommonResponse 4 | { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/Infrastructure/ITencentCOSRequester.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.COS.Infrastructure 2 | { 3 | public interface ITencentCOSRequester 4 | { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/Infrastructure/IObject.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.COS.Infrastructure 2 | { 3 | public interface IObject 4 | { 5 | public string Key { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CAM/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Cls/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Sms/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudMonitor/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CAM.Tests/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.COS.Tests/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Cls.Tests/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Sms.Tests/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.TestBase/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudLive.Tests/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/TencentCommonConsts.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.Common 2 | { 3 | public class TencentCommonConsts 4 | { 5 | public const string DefaultHttpClientName = "DefaultTencentCloud"; 6 | } 7 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudMonitor.Tests/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/Infrastructure/IBucket.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.COS.Infrastructure 2 | { 3 | public interface IBucket 4 | { 5 | public string Name { get; set; } 6 | 7 | public string Region { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/DomainManage/Model/DescribeLiveDomainsResponse.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common.Models; 2 | 3 | namespace EasyAbp.Abp.TencentCloud.CloudLive.DomainManage.Model 4 | { 5 | public class DescribeLiveDomainsResponse : CommonResponse 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/AbpTencentCloudCOSModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | using EasyAbp.Abp.TencentCloud.Common; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.COS 5 | { 6 | [DependsOn(typeof(AbpTencentCloudCommonModule))] 7 | public class AbpTencentCloudCOSModule : AbpModule 8 | { 9 | } 10 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Cls/AbpTencentCloudClsModule.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common; 2 | using Volo.Abp.Modularity; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.Cls 5 | { 6 | [DependsOn(typeof(AbpTencentCloudCommonModule))] 7 | public class AbpTencentCloudClsModule : AbpModule 8 | { 9 | } 10 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Sms/AbpTencentCloudSmsModule.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common; 2 | using Volo.Abp.Modularity; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.Sms 5 | { 6 | [DependsOn(typeof(AbpTencentCloudCommonModule))] 7 | public class AbpTencentCloudSmsModule : AbpModule 8 | { 9 | } 10 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CAM/AbpTencentCloudCAMModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | using EasyAbp.Abp.TencentCloud.Common; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CAM 5 | { 6 | [DependsOn(typeof(AbpTencentCloudCommonModule))] 7 | public class AbpTencentCloudCAMModule : AbpModule 8 | { 9 | 10 | } 11 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Captcha/AbpTencentCloudCaptchaModule.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common; 2 | using Volo.Abp.Modularity; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.Captcha 5 | { 6 | [DependsOn(typeof(AbpTencentCloudCommonModule))] 7 | public class AbpTencentCloudCaptchaModule : AbpModule 8 | { 9 | } 10 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/AbpTencentCloudCloudLiveModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | using EasyAbp.Abp.TencentCloud.Common; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudLive 5 | { 6 | [DependsOn(typeof(AbpTencentCloudCommonModule))] 7 | public class AbpTencentCloudCloudLiveModule : AbpModule 8 | { 9 | } 10 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CAM/AbpTencentCloudCAMOptions.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.CAM 2 | { 3 | public class AbpTencentCloudCAMOptions 4 | { 5 | public string EndPoint { get; set; } 6 | 7 | public AbpTencentCloudCAMOptions() 8 | { 9 | EndPoint = "cam.tencentcloudapi.com"; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/AbpTencentCloudCDNOptions.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.CDN 2 | { 3 | public class AbpTencentCloudCDNOptions 4 | { 5 | public string EndPoint { get; set; } 6 | 7 | public AbpTencentCloudCDNOptions() 8 | { 9 | EndPoint = "cdn.tencentcloudapi.com"; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudMonitor/AbpTencentCloudCloudMonitorModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | using EasyAbp.Abp.TencentCloud.Common; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudMonitor 5 | { 6 | [DependsOn(typeof(AbpTencentCloudCommonModule))] 7 | public class AbpTencentCloudCloudMonitorModule : AbpModule 8 | { 9 | 10 | } 11 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/AbpTencentCloudCDNModule.cs: -------------------------------------------------------------------------------- 1 | // ReSharper disable InconsistentNaming 2 | using EasyAbp.Abp.TencentCloud.Common; 3 | using Volo.Abp.Modularity; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.CDN 6 | { 7 | [DependsOn(typeof(AbpTencentCloudCommonModule))] 8 | public class AbpTencentCloudCDNModule : AbpModule 9 | { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/AbpTencentCloudCloudLiveOptions.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.CloudLive 2 | { 3 | public class AbpTencentCloudCloudLiveOptions 4 | { 5 | public string EndPoint { get; set; } 6 | 7 | public AbpTencentCloudCloudLiveOptions() 8 | { 9 | EndPoint = "live.tencentcloudapi.com"; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Sms.Tests/AbpTencentCloudSmsTestsModule.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.TestBase; 2 | using Volo.Abp.Modularity; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.Sms.Tests 5 | { 6 | [DependsOn(typeof(AbpTencentCloudSmsModule), 7 | typeof(AbpTencentCloudTestBaseModule))] 8 | public class AbpTencentCloudSmsTestsModule : AbpModule 9 | { 10 | } 11 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/AbpTencentCloudCommonOptions.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.Common 2 | { 3 | public class AbpTencentCloudCommonOptions 4 | { 5 | public string SecretId { get; set; } 6 | 7 | public string SecretKey { get; set; } 8 | 9 | public string AppId { get; set; } 10 | 11 | public string Region { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.TestBase/AbpTencentCloudConsts.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.TestBase 2 | { 3 | public class AbpTencentCloudConsts 4 | { 5 | public const string Region = "ap-guangzhou"; // ap-guangzhou ap-chengdu 6 | public const string SecretId = ""; 7 | public const string SecretKey = ""; 8 | public const string AppId = ""; 9 | } 10 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudMonitor/AbpTencentCloudCloudMonitorOptions.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.CloudMonitor 2 | { 3 | public class AbpTencentCloudCloudMonitorOptions 4 | { 5 | public string EndPoint { get; set; } 6 | 7 | public AbpTencentCloudCloudMonitorOptions() 8 | { 9 | EndPoint = "monitor.tencentcloudapi.com"; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudLive.Tests/AbpTencentCloudCloudLiveTestsModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | using EasyAbp.Abp.TencentCloud.TestBase; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Tests 5 | { 6 | [DependsOn(typeof(AbpTencentCloudTestBaseModule) 7 | , typeof(AbpTencentCloudCloudLiveModule))] 8 | public class AbpTencentCloudCloudLiveTestsModule : AbpModule 9 | { 10 | } 11 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CAM.Tests/AbpTencentCloudCAMTestsModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | using EasyAbp.Abp.TencentCloud.Common; 3 | using EasyAbp.Abp.TencentCloud.TestBase; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.CAM.Tests 6 | { 7 | [DependsOn(typeof(AbpTencentCloudTestBaseModule), 8 | typeof(AbpTencentCloudCAMModule))] 9 | public class AbpTencentCloudCAMTestsModule : AbpModule 10 | { 11 | } 12 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudMonitor.Tests/AbpTencentCloudCloudMonitorTestsModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | using EasyAbp.Abp.TencentCloud.TestBase; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudMonitor.Tests 5 | { 6 | [DependsOn(typeof(AbpTencentCloudCloudMonitorModule), 7 | typeof(AbpTencentCloudTestBaseModule))] 8 | public class AbpTencentCloudCloudMonitorTestsModule : AbpModule 9 | { 10 | } 11 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/DateTimeExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace EasyAbp.Abp.TencentCloud.Common 4 | { 5 | public static class DateTimeExtensions 6 | { 7 | public static long GetUtcUnixTimestamp() => DateTimeOffset.UtcNow.ToUnixTimeSeconds(); 8 | 9 | public static DateTime GetUtcDate(long unixTimestamp) => new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(unixTimestamp); 10 | } 11 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Captcha/EasyAbp.Abp.TencentCloud.Captcha.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net10.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/Models/CommonResponse.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.Common.Models 2 | { 3 | public class CommonResponse : ICommonResponse 4 | { 5 | public string RequestId { get; set; } 6 | 7 | public ErrorModel Error { get; set; } 8 | } 9 | 10 | public class ErrorModel 11 | { 12 | public string Code { get; set; } 13 | 14 | public string Message { get; set; } 15 | } 16 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/Statistics/Model/ListTopDataMetrics.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.CDN.Statistics.Model 2 | { 3 | public class ListTopDataMetrics 4 | { 5 | public const string Url = "url"; 6 | public const string Path = "path"; 7 | public const string District = "district"; 8 | public const string Isp = "isp"; 9 | public const string Host = "host"; 10 | public const string OriginHost = "originHost"; 11 | } 12 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Cls/EasyAbp.Abp.TencentCloud.Cls.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net10.0 7 | EasyAbp.Abp.TencentCloud.Cls 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Sms/EasyAbp.Abp.TencentCloud.Sms.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net10.0 7 | EasyAbp.Abp.TencentCloud.Sms 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CAM/EasyAbp.Abp.TencentCloud.CAM.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net10.0 7 | EasyAbp.Abp.TencentCloud.CAM 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.TestBase/AbpTencentCloudTestBase.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp; 2 | using Volo.Abp.Modularity; 3 | using Volo.Abp.Testing; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.TestBase 6 | { 7 | public class AbpTencentCloudTestBase : AbpIntegratedTest where TStartupModule : IAbpModule 8 | { 9 | protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) 10 | { 11 | options.UseAutofac(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/EasyAbp.Abp.TencentCloud.CloudLive.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net10.0 7 | EasyAbp.Abp.TencentCloud.CloudLive 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudMonitor/EasyAbp.Abp.TencentCloud.CloudMonitor.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net10.0 7 | EasyAbp.Abp.TencentCloud.CloudMonitor 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/AbpTencentCloudCommonModule.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.DependencyInjection; 2 | using Volo.Abp.Json; 3 | using Volo.Abp.Modularity; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.Common 6 | { 7 | [DependsOn(typeof(AbpJsonModule))] 8 | public class AbpTencentCloudCommonModule : AbpModule 9 | { 10 | public override void ConfigureServices(ServiceConfigurationContext context) 11 | { 12 | context.Services.AddHttpClient(TencentCommonConsts.DefaultHttpClientName); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/EasyAbp.Abp.TencentCloud.CDN.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net10.0 7 | EasyAbp.Abp.TencentCloud.CDN 8 | true 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Cls/AbpTencentCloudClsOptions.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.Cls 2 | { 3 | public class AbpTencentCloudClsOptions 4 | { 5 | public string Region { get; set; } 6 | 7 | public bool IsIntranet { get; set; } 8 | 9 | public string EndPoint 10 | { 11 | get => IsIntranet ? $"{Region}.cls.tencentyun.com" : $"{Region}.cls.tencentcs.com"; 12 | private set 13 | { 14 | } 15 | } 16 | 17 | public AbpTencentCloudClsOptions() 18 | { 19 | } 20 | 21 | } 22 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/Requester/ITencentCloudApiRequester.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.Common.Requester 5 | { 6 | public interface ITencentCloudApiRequester 7 | { 8 | Task SendRequestAsync(ICommonRequest request, string endpoint) where TResponse : ICommonResponse; 9 | 10 | Task SendRequestAsync(ICommonRequest request, string endpoint, AbpTencentCloudCommonOptions options) where TResponse : ICommonResponse; 11 | } 12 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/Models/ICommonRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Net.Http; 2 | 3 | namespace EasyAbp.Abp.TencentCloud.Common.Models 4 | { 5 | public interface ICommonRequest 6 | { 7 | string ResultRoot { get; } 8 | 9 | HttpRequestMessage HttpRequestMessage { get; } 10 | 11 | void SetAction(string action); 12 | 13 | void SetRegion(string region); 14 | 15 | void SetVersion(string version); 16 | 17 | void SetToken(string token); 18 | 19 | void SetEndpoint(string endpoint); 20 | 21 | void SetAuthorization(string id, string key); 22 | } 23 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Sms/AbpTencentCloudSmsOptions.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.Sms 2 | { 3 | public class AbpTencentCloudSmsOptions 4 | { 5 | public string EndPoint { get; set; } 6 | 7 | public string DefaultSmsSdkAppid { get; set; } 8 | 9 | public string DefaultSign { get; set; } 10 | 11 | public string DefaultExtendCode { get; set; } 12 | 13 | public string DefaultSenderId { get; set; } 14 | 15 | public AbpTencentCloudSmsOptions() 16 | { 17 | EndPoint = "sms.tencentcloudapi.com"; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/EasyAbp.Abp.TencentCloud.COS.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net10.0 7 | EasyAbp.Abp.TencentCloud.COS 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.COS.Tests/AbpTencentCloudCOSTestBase.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Options; 2 | using EasyAbp.Abp.TencentCloud.Common; 3 | using EasyAbp.Abp.TencentCloud.TestBase; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.COS.Tests 6 | { 7 | public class AbpTencentCloudCOSTestBase : AbpTencentCloudTestBase 8 | { 9 | protected AbpTencentCloudCommonOptions TencentCloudCommonOptions; 10 | 11 | public AbpTencentCloudCOSTestBase() 12 | { 13 | TencentCloudCommonOptions = GetRequiredService>().Value; 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Captcha/AbpTencentCloudCaptchaOptions.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.Sms 2 | { 3 | public class AbpTencentCloudCaptchaOptions 4 | { 5 | public string EndPoint { get; set; } 6 | 7 | public string DefaultCaptchaAppId { get; set; } 8 | 9 | public string DefaultAppSecretKey { get; set; } 10 | 11 | public string DefaultExtendCode { get; set; } 12 | 13 | public string DefaultSenderId { get; set; } 14 | 15 | public AbpTencentCloudCaptchaOptions() 16 | { 17 | EndPoint = "captcha.tencentcloudapi.com"; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Captcha/VerifyCaptcha/VerifyCaptchaResponse.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common.Models; 2 | 3 | namespace EasyAbp.Abp.TencentCloud.Captcha.VerifyCaptcha 4 | { 5 | public class VerifyCaptchaResponse : CommonResponse 6 | { 7 | public int CaptchaCode { get; set; } 8 | 9 | public string? CaptchaMsg { get; set; } 10 | 11 | public int? EvilLevel { get; set; } 12 | 13 | public int? GetCaptchaTime { get; set; } 14 | 15 | public int? EvilBitmap { get; set; } 16 | 17 | public int SubmitCaptchaTime { get; set; } 18 | 19 | public string? DeviceRiskCategory { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudLive.Tests/DomainManageTests.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Shouldly; 3 | using Xunit; 4 | using EasyAbp.Abp.TencentCloud.CloudLive.DomainManage.Model; 5 | 6 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Tests 7 | { 8 | public class DomainManageTests : AbpTencentCloudCloudLiveTestBase 9 | { 10 | [Fact] 11 | public async Task DescribeLiveDomains_Test() 12 | { 13 | var resp = await TencentCloudApiRequester.SendRequestAsync(new DescribeLiveDomainsRequest(), TencentCloudCloudLiveOptions.EndPoint); 14 | resp.RequestId.ShouldNotBeNull(); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.COS.Tests/AbpTencentCloudCOSTestsModule.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common; 2 | using Volo.Abp.Modularity; 3 | using EasyAbp.Abp.TencentCloud.TestBase; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.COS.Tests 6 | { 7 | [DependsOn(typeof(AbpTencentCloudTestBaseModule), 8 | typeof(AbpTencentCloudCOSModule))] 9 | public class AbpTencentCloudCOSTestsModule : AbpModule 10 | { 11 | public override void ConfigureServices(ServiceConfigurationContext context) 12 | { 13 | Configure(op => 14 | { 15 | op.Region = AbpTencentCloudConsts.Region; 16 | }); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Cls.Tests/AbpTencentCloudClsTestsModule.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.TestBase; 2 | using Volo.Abp.Modularity; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.Cls.Tests 5 | { 6 | [DependsOn(typeof(AbpTencentCloudClsModule), 7 | typeof(AbpTencentCloudTestBaseModule))] 8 | public class AbpTencentCloudClsTestsModule : AbpModule 9 | { 10 | public override void ConfigureServices(ServiceConfigurationContext context) 11 | { 12 | Configure(op => 13 | { 14 | op.Region = AbpTencentCloudConsts.Region; 15 | op.IsIntranet = false; 16 | }); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/EasyAbp.Abp.TencentCloud.Common.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net10.0 7 | EasyAbp.Abp.TencentCloud.Common 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Sms/SendSms/SendSmsResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.Sms.SendSms 5 | { 6 | public class SendSmsResponse : CommonResponse 7 | { 8 | public List SendStatusSet { get; set; } 9 | } 10 | 11 | public class SendStatusSet 12 | { 13 | public string SerialNo { get; set; } 14 | 15 | public string PhoneNumber { get; set; } 16 | 17 | public int Fee { get; set; } 18 | 19 | public string SessionContext { get; set; } 20 | 21 | public string Code { get; set; } 22 | 23 | public string Message { get; set; } 24 | 25 | public string IsoCode { get; set; } 26 | } 27 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/AbpTencentCloudCOSOptions.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.COS 2 | { 3 | public class AbpTencentCloudCOSOptions 4 | { 5 | /// 6 | /// 连接超时时间,单位是秒,默认值为 60 秒。 7 | /// 8 | public int ConnectionTimeout { get; set; } 9 | 10 | /// 11 | /// 读写超时时间,单位是秒,默认值为 40 秒。 12 | /// 13 | public int ReadWriteTimeout { get; set; } 14 | 15 | /// 16 | /// 每次请求签名的有效时长,单位为秒,默认值为 600 秒。 17 | /// 18 | public int KeyDurationSecond { get; set; } 19 | 20 | public AbpTencentCloudCOSOptions() 21 | { 22 | ConnectionTimeout = 60; 23 | ReadWriteTimeout = 40; 24 | KeyDurationSecond = 600; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Sms/SmsTemplates/DescribeSmsTemplateListRequest.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common.Models; 2 | 3 | namespace EasyAbp.Abp.TencentCloud.Sms.SmsTemplates 4 | { 5 | public class DescribeSmsTemplateListRequest : CommonRequest 6 | { 7 | public DescribeSmsTemplateListRequest( 8 | bool international, 9 | int[] templateIdSet, 10 | int? limit = null, 11 | int? offset = null) 12 | { 13 | SetAction("DescribeSmsTemplateList"); 14 | SetVersion("2021-01-11"); 15 | 16 | SetRequestBody(new 17 | { 18 | International = international ? 1 : 0, 19 | TemplateIdSet = templateIdSet, 20 | Limit = limit, 21 | Offset = offset 22 | }); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Sms/SmsTemplates/DescribeSmsTemplateListResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.Sms.SmsTemplates 5 | { 6 | public class DescribeSmsTemplateListResponse : CommonResponse 7 | { 8 | public List DescribeTemplateStatusSet { get; set; } 9 | } 10 | 11 | public class DescribeTemplateStatusSet 12 | { 13 | public int TemplateId { get; set; } 14 | 15 | public int International { get; set; } 16 | 17 | public int StatusCode { get; set; } 18 | 19 | public string ReviewReply { get; set; } 20 | 21 | public string TemplateName { get; set; } 22 | 23 | public string CreateTime { get; set; } 24 | 25 | public string TemplateContent { get; set; } 26 | } 27 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/Infrastructure/IBucketOperator.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace EasyAbp.Abp.TencentCloud.COS.Infrastructure 4 | { 5 | public interface IBucketOperator 6 | { 7 | Task CreateAsync(string bucket); 8 | 9 | Task DeleteAsync(string bucket); 10 | 11 | Task ConfigureCorsAsync(string[] sourceOrigin); 12 | 13 | Task GetCorsInfoAsync(); 14 | 15 | Task DeleteCorsAsync(); 16 | 17 | Task ConfigureLifecycleAsync(); 18 | 19 | Task GetLifecycleInfoAsync(); 20 | 21 | Task DeleteLifecycleAsync(); 22 | 23 | Task ConfigureVersioningAsync(); 24 | 25 | Task GetVersioningAsync(); 26 | 27 | Task ConfigureReplicationAsync(); 28 | 29 | Task GetReplicationAsync(); 30 | 31 | Task DeleteReplicationAsync(); 32 | } 33 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudLive.Tests/AbpTencentCloudCloudLiveTestBase.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Options; 2 | using EasyAbp.Abp.TencentCloud.Common.Requester; 3 | using EasyAbp.Abp.TencentCloud.TestBase; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Tests 6 | { 7 | public class AbpTencentCloudCloudLiveTestBase : AbpTencentCloudTestBase 8 | { 9 | protected readonly ITencentCloudApiRequester TencentCloudApiRequester; 10 | protected readonly AbpTencentCloudCloudLiveOptions TencentCloudCloudLiveOptions; 11 | 12 | public AbpTencentCloudCloudLiveTestBase() 13 | { 14 | TencentCloudApiRequester = GetRequiredService(); 15 | TencentCloudCloudLiveOptions = GetRequiredService>().Value; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/Statistics/Model/DescribeLiveStreamPushInfoListRequest.cs: -------------------------------------------------------------------------------- 1 | using JetBrains.Annotations; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Statistics.Model 5 | { 6 | public sealed class DescribeLiveStreamPushInfoListRequest : CommonRequest 7 | { 8 | public DescribeLiveStreamPushInfoListRequest([CanBeNull] string pushDomain = null, 9 | [CanBeNull] string appName= null, 10 | int? pageNum= null, 11 | int? pageSize= null) 12 | { 13 | SetAction("DescribeLiveStreamPushInfoList"); 14 | SetVersion("2018-08-01"); 15 | 16 | SetRequestBody(new 17 | { 18 | pushDomain, 19 | appName, 20 | pageNum, 21 | pageSize 22 | }); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.TestBase/AbpTencentCloudTestBaseModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp; 2 | using Volo.Abp.Autofac; 3 | using Volo.Abp.Modularity; 4 | using EasyAbp.Abp.TencentCloud.Common; 5 | 6 | namespace EasyAbp.Abp.TencentCloud.TestBase 7 | { 8 | [DependsOn(typeof(AbpTencentCloudCommonModule), 9 | typeof(AbpTestBaseModule), 10 | typeof(AbpAutofacModule))] 11 | public class AbpTencentCloudTestBaseModule : AbpModule 12 | { 13 | public override void ConfigureServices(ServiceConfigurationContext context) 14 | { 15 | Configure(op => 16 | { 17 | op.SecretId = AbpTencentCloudConsts.SecretId; 18 | op.SecretKey = AbpTencentCloudConsts.SecretKey; 19 | op.AppId = AbpTencentCloudConsts.AppId; 20 | op.Region = AbpTencentCloudConsts.Region; 21 | }); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CAM/STS/GetFederationTokenRequest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Newtonsoft.Json; 3 | using EasyAbp.Abp.TencentCloud.CAM.Infrastructure; 4 | using EasyAbp.Abp.TencentCloud.Common.Models; 5 | 6 | namespace EasyAbp.Abp.TencentCloud.CAM.STS 7 | { 8 | public class GetFederationTokenRequest : CommonRequest 9 | { 10 | public GetFederationTokenRequest( 11 | string name, 12 | Policy policy, 13 | int? durationSeconds = null) 14 | { 15 | SetAction("GetFederationToken"); 16 | SetVersion("2018-08-13"); 17 | 18 | if (durationSeconds > 7200) throw new ArgumentOutOfRangeException(nameof(durationSeconds), "有效期最大时长不得超过 7200 秒。"); 19 | 20 | SetRequestBody(new 21 | { 22 | Name = name, 23 | Policy = JsonConvert.SerializeObject(policy), 24 | DurationSeconds = durationSeconds 25 | }); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/Statistics/Model/ListTopDataFilter.cs: -------------------------------------------------------------------------------- 1 | // ReSharper disable InconsistentNaming 2 | 3 | namespace EasyAbp.Abp.TencentCloud.CDN.Statistics.Model 4 | { 5 | public class ListTopDataFilter : DescribeCdnDataMetrics 6 | { 7 | /// 8 | /// 指定回源状态码统计,在 Code 参数中填充指定状态码。 9 | /// 10 | public const string OriginStatusCode = "OriginStatusCode"; 11 | /// 12 | /// 回源 2XX 状态码。 13 | /// 14 | public const string Origin_2XX = "origin_2XX"; 15 | /// 16 | /// 回源 3XX 状态码。 17 | /// 18 | public const string Origin_3XX = "origin_3XX"; 19 | /// 20 | /// 回源 4XX 状态码。 21 | /// 22 | public const string Origin_4XX = "origin_4XX"; 23 | /// 24 | /// 回源 5XX 状态码。 25 | /// 26 | public const string Origin_5XX = "origin_5XX"; 27 | } 28 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/DomainManage/Model/DescribeLiveDomainsRequest.cs: -------------------------------------------------------------------------------- 1 | using JetBrains.Annotations; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudLive.DomainManage.Model 5 | { 6 | public sealed class DescribeLiveDomainsRequest : CommonRequest 7 | { 8 | public DescribeLiveDomainsRequest(int? domainStatus = null, 9 | int? domainType = null, 10 | int? pageSize = null, 11 | int? pageNum = null, 12 | int? isDelayLive = null, 13 | [CanBeNull] string domainPrefix = null) 14 | { 15 | SetAction("DescribeLiveDomains"); 16 | SetVersion("2018-08-01"); 17 | 18 | SetRequestBody(new 19 | { 20 | domainStatus, 21 | domainType, 22 | pageSize, 23 | pageNum, 24 | isDelayLive, 25 | domainPrefix 26 | }); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/Statistics/Model/DescribeStreamPlayInfoListRequest.cs: -------------------------------------------------------------------------------- 1 | using JetBrains.Annotations; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Statistics.Model 5 | { 6 | public sealed class DescribeStreamPlayInfoListRequest : CommonRequest 7 | { 8 | public DescribeStreamPlayInfoListRequest(string startTime, 9 | string endTime, 10 | [CanBeNull] string playDomain = null, 11 | [CanBeNull] string streamName = null, 12 | [CanBeNull] string appName = null) 13 | { 14 | SetAction("DescribeStreamPlayInfoList"); 15 | SetVersion("2018-08-01"); 16 | 17 | SetRequestBody(new 18 | { 19 | StartTime = startTime, 20 | EndTime = endTime, 21 | PlayDomain = playDomain, 22 | StreamName = streamName, 23 | AppName = appName 24 | }); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/StringExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Security.Cryptography; 2 | using System.Text; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.Common 5 | { 6 | public static class StringExtensions 7 | { 8 | public static string ToSha256(this string src) 9 | { 10 | using (SHA256 sha256 = SHA256.Create()) 11 | { 12 | var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(src)); 13 | var sb = new StringBuilder(); 14 | foreach (var @byte in hashBytes) 15 | { 16 | sb.Append(@byte.ToString("x2")); 17 | } 18 | 19 | return sb.ToString(); 20 | } 21 | } 22 | 23 | public static byte[] HmacSha256(byte[] key, string data) 24 | { 25 | using (var hmac256 = new HMACSHA256(key)) 26 | { 27 | return hmac256.ComputeHash(Encoding.UTF8.GetBytes(data)); 28 | } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /EasyAbp.Abp.TencentCloud.sln.DotSettings: -------------------------------------------------------------------------------- 1 | 2 | CAM 3 | COS 4 | STS 5 | True 6 | True 7 | True 8 | True -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Cls.Tests/AbpTencentCloudClsTestBase.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common; 2 | using EasyAbp.Abp.TencentCloud.Common.Requester; 3 | using EasyAbp.Abp.TencentCloud.TestBase; 4 | using Microsoft.Extensions.Options; 5 | 6 | namespace EasyAbp.Abp.TencentCloud.Cls.Tests 7 | { 8 | public class AbpTencentCloudClsTestBase : AbpTencentCloudTestBase 9 | { 10 | protected readonly ITencentCloudApiRequester TencentCloudApiRequester; 11 | protected readonly AbpTencentCloudClsOptions TencentCloudClsOptions; 12 | protected readonly AbpTencentCloudCommonOptions TencentCloudCommonOptions; 13 | 14 | public AbpTencentCloudClsTestBase() 15 | { 16 | TencentCloudApiRequester = GetRequiredService(); 17 | TencentCloudClsOptions = GetRequiredService>().Value; 18 | TencentCloudCommonOptions = GetRequiredService>().Value; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Sms.Tests/AbpTencentCloudSmsTestBase.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common; 2 | using EasyAbp.Abp.TencentCloud.Common.Requester; 3 | using EasyAbp.Abp.TencentCloud.TestBase; 4 | using Microsoft.Extensions.Options; 5 | 6 | namespace EasyAbp.Abp.TencentCloud.Sms.Tests 7 | { 8 | public class AbpTencentCloudSmsTestBase : AbpTencentCloudTestBase 9 | { 10 | protected readonly ITencentCloudApiRequester TencentCloudApiRequester; 11 | protected readonly AbpTencentCloudSmsOptions TencentCloudSmsOptions; 12 | protected readonly AbpTencentCloudCommonOptions TencentCloudCommonOptions; 13 | 14 | public AbpTencentCloudSmsTestBase() 15 | { 16 | TencentCloudApiRequester = GetRequiredService(); 17 | TencentCloudSmsOptions = GetRequiredService>().Value; 18 | TencentCloudCommonOptions = GetRequiredService>().Value; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CAM/STS/GetFederationTokenResponse.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common.Models; 2 | 3 | namespace EasyAbp.Abp.TencentCloud.CAM.STS 4 | { 5 | public class GetFederationTokenResponse : CommonResponse 6 | { 7 | /// 8 | /// 9 | /// 10 | public int ExpiredTime { get; set; } 11 | 12 | /// 13 | /// 14 | /// 15 | public string Expiration { get; set; } 16 | 17 | /// 18 | /// 19 | /// 20 | public Credentials Credentials { get; set; } 21 | } 22 | 23 | public class Credentials 24 | { 25 | /// 26 | /// 27 | /// 28 | public string Token { get; set; } 29 | 30 | /// 31 | /// 32 | /// 33 | public string TmpSecretId { get; set; } 34 | 35 | /// 36 | /// 37 | /// 38 | public string TmpSecretKey { get; set; } 39 | } 40 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CAM.Tests/AbpTencentCloudCAMTestBase.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Options; 2 | using EasyAbp.Abp.TencentCloud.Common; 3 | using EasyAbp.Abp.TencentCloud.Common.Requester; 4 | using EasyAbp.Abp.TencentCloud.TestBase; 5 | 6 | namespace EasyAbp.Abp.TencentCloud.CAM.Tests 7 | { 8 | public class AbpTencentCloudCAMTestBase : AbpTencentCloudTestBase 9 | { 10 | protected readonly ITencentCloudApiRequester TencentCloudApiRequester; 11 | 12 | protected readonly AbpTencentCloudCommonOptions TencentCloudCommonOptions; 13 | protected readonly AbpTencentCloudCAMOptions TencentCloudCAMOptions; 14 | 15 | public AbpTencentCloudCAMTestBase() 16 | { 17 | TencentCloudApiRequester = GetRequiredService(); 18 | TencentCloudCommonOptions = GetRequiredService>().Value; 19 | TencentCloudCAMOptions = GetRequiredService>().Value; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.COS.Tests/BucketOperatorTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Xunit; 4 | using EasyAbp.Abp.TencentCloud.COS.Infrastructure; 5 | using Shouldly; 6 | 7 | namespace EasyAbp.Abp.TencentCloud.COS.Tests 8 | { 9 | public class BucketOperatorTests : AbpTencentCloudCOSTestBase 10 | { 11 | private readonly IBucketOperator _bucketOperator; 12 | private readonly string _bucketName = Guid.NewGuid().ToString(); 13 | 14 | public BucketOperatorTests() 15 | { 16 | _bucketOperator = GetRequiredService(); 17 | } 18 | 19 | [Fact] 20 | public async Task Create_Test() 21 | { 22 | var result = await _bucketOperator.CreateAsync(_bucketName); 23 | result.ShouldNotBeNull(); 24 | } 25 | 26 | [Fact] 27 | public async Task Delete_Test() 28 | { 29 | var result = await _bucketOperator.DeleteAsync(_bucketName); 30 | result.ShouldNotBeNull(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Sms.Tests/SendSmsTests.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using System.Threading.Tasks; 3 | using EasyAbp.Abp.TencentCloud.Sms.SendSms; 4 | using Shouldly; 5 | using Xunit; 6 | 7 | namespace EasyAbp.Abp.TencentCloud.Sms.Tests 8 | { 9 | public class SendSmsTests : AbpTencentCloudSmsTestBase 10 | { 11 | [Fact] 12 | public async Task SendSmsTest() 13 | { 14 | var result = await TencentCloudApiRequester.SendRequestAsync( 15 | new SendSmsRequest( 16 | new []{"+8613000000000"}, 17 | "400000", 18 | "", 19 | "多态科技", 20 | new []{"123456"}), 21 | TencentCloudSmsOptions.EndPoint); 22 | 23 | result.ShouldNotBeNull(); 24 | result.Error.ShouldBeNull(); 25 | result.SendStatusSet.ShouldNotBeNull(); 26 | result.SendStatusSet.ShouldNotBeEmpty(); 27 | result.SendStatusSet.First().Code.ShouldBe("Ok"); 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Cls.Tests/LogManagement/SearchLogTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Threading.Tasks; 4 | using EasyAbp.Abp.TencentCloud.Cls.LogManagement.SearchLog; 5 | using Shouldly; 6 | using Xunit; 7 | 8 | namespace EasyAbp.Abp.TencentCloud.Cls.Tests.LogManagement 9 | { 10 | public class SearchLogTests : AbpTencentCloudClsTestBase 11 | { 12 | [Fact] 13 | public async Task Should_Get_Logs() 14 | { 15 | var result = await TencentCloudApiRequester.SendRequestAsync( 16 | new SearchLogRequest( 17 | "", 18 | "", 19 | DateTime.Now.AddDays(-7), 20 | DateTime.Now, 21 | "", 22 | 100), 23 | TencentCloudClsOptions.EndPoint); 24 | 25 | result.ShouldNotBeNull(); 26 | result.Error.ShouldBeNull(); 27 | result.Results.ShouldNotBeEmpty(); 28 | result.Results.First().Content.ShouldNotBeNullOrEmpty(); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 EasyAbp Team 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudMonitor.Tests/AbpTencentCloudCloudMonitorTestBase.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Options; 2 | using EasyAbp.Abp.TencentCloud.Common; 3 | using EasyAbp.Abp.TencentCloud.Common.Requester; 4 | using EasyAbp.Abp.TencentCloud.TestBase; 5 | 6 | namespace EasyAbp.Abp.TencentCloud.CloudMonitor.Tests 7 | { 8 | public class AbpTencentCloudCloudMonitorTestBase : AbpTencentCloudTestBase 9 | { 10 | protected readonly ITencentCloudApiRequester TencentCloudApiRequester; 11 | protected readonly AbpTencentCloudCloudMonitorOptions TencentCloudCloudMonitorOptions; 12 | protected readonly AbpTencentCloudCommonOptions TencentCloudCommonOptions; 13 | 14 | public AbpTencentCloudCloudMonitorTestBase() 15 | { 16 | TencentCloudApiRequester = GetRequiredService(); 17 | TencentCloudCloudMonitorOptions = GetRequiredService>().Value; 18 | TencentCloudCommonOptions = GetRequiredService>().Value; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/Statistics/Model/DescribeStreamPlayInfoListResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Statistics.Model 5 | { 6 | public class DescribeStreamPlayInfoListResponse : CommonResponse 7 | { 8 | /// 9 | /// 10 | /// 11 | public List DataInfoList { get; set; } 12 | } 13 | 14 | public class DayStreamPlayInfo 15 | { 16 | /// 17 | /// 18 | /// 19 | public string Time { get; set; } 20 | 21 | /// 22 | /// 23 | /// 24 | public double Bandwidth { get; set; } 25 | 26 | /// 27 | /// 28 | /// 29 | public double Flux { get; set; } 30 | 31 | /// 32 | /// 33 | /// 34 | public int Request { get; set; } 35 | 36 | /// 37 | /// 38 | /// 39 | public int Online { get; set; } 40 | } 41 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Sms/SendSms/SendSmsRequest.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common.Models; 2 | 3 | namespace EasyAbp.Abp.TencentCloud.Sms.SendSms 4 | { 5 | public class SendSmsRequest : CommonRequest 6 | { 7 | public SendSmsRequest( 8 | string[] phoneNumberSet, 9 | string templateId, 10 | string smsSdkAppid, 11 | string sign = null, 12 | string[] templateParamSet = null, 13 | string extendCode = null, 14 | string sessionContext = null, 15 | string senderId = null) 16 | { 17 | SetAction("SendSms"); 18 | SetVersion("2019-07-11"); 19 | 20 | SetRequestBody(new 21 | { 22 | PhoneNumberSet = phoneNumberSet, 23 | TemplateID = templateId, 24 | SmsSdkAppid = smsSdkAppid, 25 | Sign = sign, 26 | TemplateParamSet = templateParamSet, 27 | ExtendCode = extendCode, 28 | SessionContext = sessionContext, 29 | SenderId = senderId 30 | }); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Cls/LogManagement/SearchLog/SearchLogResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Text.Json.Serialization; 3 | using EasyAbp.Abp.TencentCloud.Common.Models; 4 | using Newtonsoft.Json; 5 | 6 | namespace EasyAbp.Abp.TencentCloud.Cls.LogManagement.SearchLog 7 | { 8 | public class SearchLogResponse : CommonResponse 9 | { 10 | public string Context { get; set; } 11 | 12 | public bool Listover { get; set; } 13 | 14 | public List Results { get; set; } 15 | } 16 | 17 | public class TencentClsLogObject 18 | { 19 | [JsonPropertyName("topic_id")] 20 | [JsonProperty("topic_id")] 21 | public string TopicId { get; set; } 22 | 23 | [JsonPropertyName("topic_name")] 24 | [JsonProperty("topic_name")] 25 | public string TopicName { get; set; } 26 | 27 | public string Timestamp { get; set; } 28 | 29 | public string Content { get; set; } 30 | 31 | public string Filename { get; set; } 32 | 33 | public string Source { get; set; } 34 | } 35 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/Statistics/Model/ListTopDataResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CDN.Statistics.Model 5 | { 6 | public class ListTopDataResponse : CommonResponse 7 | { 8 | /// 9 | /// 各个资源的 Top 访问数据详情。 10 | /// 11 | public List Data { get; set; } 12 | } 13 | 14 | public class ListTopData 15 | { 16 | /// 17 | /// 资源名称,根据查询条件不同分为以下几类。
18 | /// 具体域名: 表示该域名明细数据。
19 | /// multiDomains: 表示多域名汇总明细数据。
20 | /// 项目 ID: 指定项目查询时,显示为项目 ID。
21 | /// all: 账号维度明细数据。 22 | ///
23 | public string Resource { get; set; } 24 | 25 | /// 26 | /// 排序结果详情。 27 | /// 28 | public List DetailData { get; set; } 29 | } 30 | 31 | public class TopDetailData 32 | { 33 | /// 34 | /// 数据类型的名称。 35 | /// 36 | public string Name { get; set; } 37 | 38 | /// 39 | /// 数据值。 40 | /// 41 | public int Value { get; set; } 42 | } 43 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/Statistics/Model/DescribeStreamDayPlayInfoListResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Statistics.Model 5 | { 6 | public class DescribeStreamDayPlayInfoListResponse : CommonResponse 7 | { 8 | /// 9 | /// 10 | /// 11 | public List DataInfoList { get; set; } 12 | 13 | /// 14 | /// 15 | /// 16 | public int TotalNum { get; set; } 17 | 18 | /// 19 | /// 20 | /// 21 | public int TotalPage { get; set; } 22 | 23 | /// 24 | /// 25 | /// 26 | public int PageNum { get; set; } 27 | 28 | /// 29 | /// 30 | /// 31 | public int PageSize { get; set; } 32 | } 33 | 34 | public class StreamInfo 35 | { 36 | /// 37 | /// 38 | /// 39 | public string StreamName { get; set; } 40 | 41 | /// 42 | /// 43 | /// 44 | public int TotalFlux { get; set; } 45 | } 46 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CAM.Tests/EasyAbp.Abp.TencentCloud.CAM.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net10.0 5 | false 6 | 7 | 8 | 9 | 10 | 11 | 12 | all 13 | runtime; build; native; contentfiles; analyzers; buildtransitive 14 | 15 | 16 | all 17 | runtime; build; native; contentfiles; analyzers; buildtransitive 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.COS.Tests/EasyAbp.Abp.TencentCloud.COS.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net10.0 5 | false 6 | 7 | 8 | 9 | 10 | 11 | 12 | all 13 | runtime; build; native; contentfiles; analyzers; buildtransitive 14 | 15 | 16 | all 17 | runtime; build; native; contentfiles; analyzers; buildtransitive 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/Statistics/Model/DescribeStreamDayPlayInfoListRequest.cs: -------------------------------------------------------------------------------- 1 | using JetBrains.Annotations; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Statistics.Model 5 | { 6 | public class DescribeStreamDayPlayInfoListRequest : CommonRequest 7 | { 8 | /// 9 | /// 查询天维度每条流的播放数据,包括总流量等 10 | /// 11 | /// 需要查询的日期,格式为 yyyy-MM-dd 12 | /// 需要查询的播放域名。 13 | /// 页号,范围 [1,10],默认值是 1。 14 | /// 每页个数,范围 [100,1000],默认值是 1000。 15 | public DescribeStreamDayPlayInfoListRequest(string dayTime, 16 | [CanBeNull] string playDomain = null, 17 | [CanBeNull] string pageNum = null, 18 | [CanBeNull] string pageSize = null) 19 | { 20 | SetAction("DescribeStreamDayPlayInfoList"); 21 | SetVersion("2018-08-01"); 22 | 23 | SetRequestBody(new 24 | { 25 | DayTime = dayTime, 26 | PlayDomain = playDomain, 27 | PageNum = pageNum, 28 | PageSize = pageSize 29 | }); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Cls.Tests/EasyAbp.Abp.TencentCloud.Cls.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net10.0 5 | false 6 | EasyAbp.Abp.TencentCloud.Cls.Tests 7 | 8 | 9 | 10 | 11 | 12 | 13 | all 14 | runtime; build; native; contentfiles; analyzers; buildtransitive 15 | 16 | 17 | all 18 | runtime; build; native; contentfiles; analyzers; buildtransitive 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudLive.Tests/EasyAbp.Abp.TencentCloud.CloudLive.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net10.0 5 | false 6 | 7 | 8 | 9 | 10 | 11 | 12 | all 13 | runtime; build; native; contentfiles; analyzers; buildtransitive 14 | 15 | 16 | all 17 | runtime; build; native; contentfiles; analyzers; buildtransitive 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Captcha/VerifyCaptcha/VerifyCaptchaRequest.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common.Models; 2 | 3 | namespace EasyAbp.Abp.TencentCloud.Captcha.VerifyCaptcha 4 | { 5 | public class VerifyCaptchaRequest : CommonRequest 6 | { 7 | public VerifyCaptchaRequest( 8 | string ticket, 9 | string randomString, 10 | string userIp, 11 | string captchaAppId, 12 | string appSecretKey, 13 | int? businessId, 14 | int? sceneId, 15 | string? macAddress, 16 | string? imei, 17 | int needGetCaptchaTime) 18 | { 19 | SetAction("DescribeCaptchaResult"); 20 | SetVersion("2019-07-22"); 21 | 22 | SetRequestBody(new 23 | { 24 | CaptchaType = 9, 25 | Ticket = ticket, 26 | Randstr = randomString, 27 | CaptchaAppId = captchaAppId, 28 | AppSecretKey = appSecretKey, 29 | UserIp = userIp, 30 | NeedGetCaptchaTime = needGetCaptchaTime, 31 | BusinessId = businessId, 32 | Imei = imei, 33 | SceneId = sceneId, 34 | MacAddress = macAddress 35 | }); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudMonitor.Tests/EasyAbp.Abp.TencentCloud.CloudMonitor.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net10.0 5 | false 6 | 7 | 8 | 9 | 10 | 11 | 12 | all 13 | runtime; build; native; contentfiles; analyzers; buildtransitive 14 | 15 | 16 | all 17 | runtime; build; native; contentfiles; analyzers; buildtransitive 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /common.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | latest 4 | 1.24.0 5 | $(NoWarn);CS1591 6 | true 7 | EasyAbp Team 8 | 专门为 ABP vNext 封装的腾讯云 SDK 模块。 9 | https://avatars3.githubusercontent.com/u/58311641?s=128 10 | https://github.com/EasyAbp/Abp.TencentCloud 11 | https://github.com/EasyAbp/Abp.TencentCloud 12 | abp module easyabp tencent tencentcloud txyun qcloud could sdk zony 13 | EasyAbp 14 | MIT 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | all 25 | runtime; build; native; contentfiles; analyzers 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Sms.Tests/EasyAbp.Abp.TencentCloud.Sms.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net10.0 5 | false 6 | EasyAbp.Abp.TencentCloud.Sms.Tests 7 | 8 | 9 | 10 | 11 | 12 | 13 | all 14 | runtime; build; native; contentfiles; analyzers; buildtransitive 15 | 16 | 17 | all 18 | runtime; build; native; contentfiles; analyzers; buildtransitive 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CAM/Infrastructure/Policy.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Text.Json.Serialization; 3 | using Newtonsoft.Json; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.CAM.Infrastructure 6 | { 7 | public class Policy 8 | { 9 | [JsonPropertyName("version")] 10 | [JsonProperty("version")] 11 | public string Version { get; set; } 12 | 13 | [JsonPropertyName("statement")] 14 | [JsonProperty("statement")] 15 | public List Statements { get; set; } 16 | } 17 | 18 | public class Statement 19 | { 20 | // TODO: 有待完善。 21 | // public Principal principal { get; set; } 22 | 23 | /// 24 | /// 25 | /// 26 | [JsonPropertyName("effect")] 27 | [JsonProperty("effect")] 28 | public string Effect { get; set; } 29 | 30 | /// 31 | /// 32 | /// 33 | [JsonPropertyName("action")] 34 | [JsonProperty("action")] 35 | public List Action { get; set; } 36 | 37 | /// 38 | /// 39 | /// 40 | [JsonPropertyName("resource")] 41 | [JsonProperty("resource")] 42 | public List Resource { get; set; } 43 | 44 | // TODO: 有待完善。 45 | // public Condition condition { get; set; } 46 | } 47 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.TestBase/EasyAbp.Abp.TencentCloud.TestBase.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net10.0 5 | false 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | all 16 | runtime; build; native; contentfiles; analyzers; buildtransitive 17 | 18 | 19 | all 20 | runtime; build; native; contentfiles; analyzers; buildtransitive 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Cls/LogManagement/SearchLog/SearchLogRequest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Net.Http; 5 | using System.Web; 6 | using EasyAbp.Abp.TencentCloud.Common.Models; 7 | 8 | namespace EasyAbp.Abp.TencentCloud.Cls.LogManagement.SearchLog 9 | { 10 | public class SearchLogRequest : ClsCommonRequest 11 | { 12 | public SearchLogRequest( 13 | string logSetId, 14 | string topicIds, 15 | DateTime startTime, 16 | DateTime endTime, 17 | string queryString, 18 | int limit, 19 | string context = null, 20 | string sort = null) : base(HttpMethod.Get, "searchlog", "http") 21 | { 22 | HttpRequestMessage.Method = HttpMethod.Get; 23 | 24 | SetRequestParamsRecord("logset_id", logSetId); 25 | SetRequestParamsRecord("topic_ids", topicIds); 26 | SetRequestParamsRecord("start_time", startTime.ToString("yyyy-MM-dd HH:mm:ss")); 27 | SetRequestParamsRecord("end_time", endTime.ToString("yyyy-MM-dd HH:mm:ss")); 28 | SetRequestParamsRecord("query_string", queryString); 29 | SetRequestParamsRecord("limit", limit.ToString()); 30 | if (context != null) SetRequestParamsRecord("context", context); 31 | if (sort != null) SetRequestParamsRecord("sort", sort); 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Sms.Tests/DescribeSmsTemplateListTests.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using EasyAbp.Abp.TencentCloud.Sms.SmsTemplates; 3 | using Shouldly; 4 | using Xunit; 5 | 6 | namespace EasyAbp.Abp.TencentCloud.Sms.Tests 7 | { 8 | public class DescribeSmsTemplateListTests : AbpTencentCloudSmsTestBase 9 | { 10 | [Fact] 11 | public async Task DescribeTemplateStatusSetTest() 12 | { 13 | var result = await TencentCloudApiRequester.SendRequestAsync( 14 | new DescribeSmsTemplateListRequest( 15 | false, 16 | new[] { 1039198, 686954 }), 17 | TencentCloudSmsOptions.EndPoint); 18 | 19 | result.ShouldNotBeNull(); 20 | result.Error.ShouldBeNull(); 21 | result.DescribeTemplateStatusSet.ShouldNotBeEmpty(); 22 | result.DescribeTemplateStatusSet.Count.ShouldBe(2); 23 | result.DescribeTemplateStatusSet.ShouldContain(x => 24 | x.TemplateId == 1039198 && x.StatusCode == 0 && x.TemplateName == "绑定手机验证码" && 25 | x.TemplateContent == "您正在进行绑定手机操作,{1} 为您的验证码,如非本人操作,请忽略本短信。"); 26 | result.DescribeTemplateStatusSet.ShouldContain(x => 27 | x.TemplateId == 686954 && x.StatusCode == 0 && x.TemplateName == "验证码" && 28 | x.TemplateContent == "验证码为:{1},您正在登录,若非本人操作,请勿泄露。"); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/Statistics/Model/DescribeCdnDataMetrics.cs: -------------------------------------------------------------------------------- 1 | namespace EasyAbp.Abp.TencentCloud.CDN.Statistics.Model 2 | { 3 | public class DescribeCdnDataMetrics 4 | { 5 | /// 6 | /// 流量,单位为 byte。 7 | /// 8 | public const string Flux = "flux"; 9 | /// 10 | /// 贷款,单位为 bps。 11 | /// 12 | public const string Bandwidth = "bandwidth"; 13 | /// 14 | /// 请求数,单位为 次。 15 | /// 16 | public const string Request = "request"; 17 | /// 18 | /// 流量命中率,单位为 %。 19 | /// 20 | public const string FluxHitRate = "fluxHitRate"; 21 | 22 | /// 23 | /// 状态码,返回 2xx、3xx、4xx、5xx 的汇总数据,单位为 个。 24 | /// 25 | public const string StatusCode = "statusCode"; 26 | /// 27 | /// 返回 2xx 状态码的汇总以及 2 开头状态码数据,单位为 个。 28 | /// 29 | public const string _2xx = "2xx"; 30 | /// 31 | /// 返回 3xx 状态码汇总及各 3 开头状态码数据,单位为 个。 32 | /// 33 | public const string _3xx = "3xx"; 34 | /// 35 | /// 返回 4xx 状态码汇总及各 4 开头状态码数据,单位为 个。 36 | /// 37 | public const string _4xx = "4xx"; 38 | /// 39 | /// 返回 5xx 状态码汇总及各 5 开头状态码数据,单位为 个。 40 | /// 41 | public const string _5xx = "5xx"; 42 | } 43 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CAM/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Cls/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Sms/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudMonitor/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CAM.Tests/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.COS.Tests/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Cls.Tests/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.Sms.Tests/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.TestBase/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudLive.Tests/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudMonitor.Tests/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 16 | 17 | 18 | 19 | 20 | A comma-separated list of error codes that can be safely ignored in assembly verification. 21 | 22 | 23 | 24 | 25 | 'false' to turn off automatic generation of the XML Schema file. 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudMonitor/BaseMonitor/GetMonitorDataRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using JetBrains.Annotations; 3 | using EasyAbp.Abp.TencentCloud.Common.Models; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.CloudMonitor.BaseMonitor 6 | { 7 | public class GetMonitorDataRequest : CommonRequest 8 | { 9 | public GetMonitorDataRequest( 10 | List instances, 11 | string @namespace, 12 | string metricName, 13 | int? period = null, 14 | [CanBeNull] string startTime = null, 15 | [CanBeNull] string endTime = null) 16 | { 17 | SetAction("GetMonitorData"); 18 | SetVersion("2018-07-24"); 19 | 20 | SetRequestBody(new 21 | { 22 | Namespace = @namespace, 23 | MetricName = metricName, 24 | Instances = instances, 25 | Period = period, 26 | StartTime = startTime, 27 | EndTime = endTime 28 | }); 29 | } 30 | } 31 | 32 | public class Dimension 33 | { 34 | public string Name { get; set; } 35 | 36 | public string Value { get; set; } 37 | 38 | public Dimension(string name, string value) 39 | { 40 | Name = name; 41 | Value = value; 42 | } 43 | 44 | public Dimension() 45 | { 46 | } 47 | } 48 | 49 | public class Instance 50 | { 51 | public List Dimensions { get; set; } 52 | } 53 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudMonitor/BaseMonitor/GetMonitorDataResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudMonitor.BaseMonitor 5 | { 6 | public class GetMonitorDataResponse : CommonResponse 7 | { 8 | /// 9 | /// 10 | /// 11 | public string StartTime { get; set; } 12 | 13 | /// 14 | /// 15 | /// 16 | public string EndTime { get; set; } 17 | 18 | /// 19 | /// 20 | /// 21 | public int Period { get; set; } 22 | 23 | /// 24 | /// 25 | /// 26 | public string MetricName { get; set; } 27 | 28 | /// 29 | /// 30 | /// 31 | public List DataPoints { get; set; } 32 | } 33 | 34 | public class DataPointItem 35 | { 36 | /// 37 | /// 38 | /// 39 | public List Dimensions { get; set; } 40 | 41 | /// 42 | /// 43 | /// 44 | public List Timestamps { get; set; } 45 | 46 | /// 47 | /// 48 | /// 49 | public List Values { get; set; } 50 | } 51 | 52 | public class DimensionItem 53 | { 54 | /// 55 | /// 56 | /// 57 | public string Name { get; set; } 58 | 59 | /// 60 | /// 61 | /// 62 | public string Value { get; set; } 63 | } 64 | } -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Abp.TencentCloud 2 | 3 | [![ABP version](https://img.shields.io/badge/dynamic/xml?style=flat-square&color=yellow&label=abp&query=%2F%2FProject%2FPropertyGroup%2FAbpVersion&url=https%3A%2F%2Fraw.githubusercontent.com%2FEasyAbp%2FAbp.TencentCloud%2Fmaster%2FDirectory.Build.props)](https://abp.io) 4 | [![NuGet](https://img.shields.io/nuget/v/EasyAbp.Abp.TencentCloud.Common.svg?style=flat-square)](https://www.nuget.org/packages/EasyAbp.Abp.TencentCloud.Common) 5 | [![NuGet Download](https://img.shields.io/nuget/dt/EasyAbp.Abp.TencentCloud.Common.svg?style=flat-square)](https://www.nuget.org/packages/EasyAbp.Abp.TencentCloud.Common) 6 | [![Discord online](https://badgen.net/discord/online-members/xyg8TrRa27?label=Discord)](https://discord.gg/xyg8TrRa27) 7 | [![GitHub stars](https://img.shields.io/github/stars/EasyAbp/Abp.TencentCloud?style=social)](https://www.github.com/EasyAbp/Abp.TencentCloud) 8 | 9 | 专门为 ABP vNext 封装的腾讯云 SDK 模块。 10 | 11 | ## Installation 12 | 13 | 1. Install the following NuGet packages. ([see how](https://github.com/EasyAbp/EasyAbpGuide/blob/master/docs/How-To.md#add-nuget-packages)) 14 | 15 | * EasyAbp.Abp.TencentCloud.Xxx 16 | 17 | 1. Add `DependsOn(typeof(AbpTencentCloudXxxModule))` attribute to configure the module dependencies. ([see how](https://github.com/EasyAbp/EasyAbpGuide/blob/master/docs/How-To.md#add-module-dependencies)) 18 | 19 | ## Usage 20 | 21 | 1. 通过 `Configure()` 方法配置你的腾讯云相关参数。 22 | 23 | 1. 通过 `Configure()` 方法配置对应模块的特殊参数。 24 | 25 | 1. 注入 `ITencentCloudApiRequester` 用于发送请求,其中 Request 和 Response 取决于对应模块提供的类型。 26 | 27 | > 注意: 28 | > 29 | > 如果目前仓库没有实现的 Requset 或 Response,你也可以直接继承 `CommonRequest` 类型与 `CommonResponse` 类型。我们也希望大家参与完善本模块的其他功能。 30 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Cls/LogManagement/ClsCommonRequest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Net.Http; 5 | using System.Web; 6 | using EasyAbp.Abp.TencentCloud.Common.Models; 7 | 8 | namespace EasyAbp.Abp.TencentCloud.Cls.LogManagement 9 | { 10 | public class ClsCommonRequest : CommonRequest 11 | { 12 | public override string ResultRoot { get; } = ""; 13 | 14 | public ClsCommonRequest(HttpMethod httpMethod, string apiPath, string scheme) : base(apiPath, scheme) 15 | { 16 | HttpRequestMessage.Method = httpMethod; 17 | } 18 | 19 | protected void SetRequestParamsRecord(string key, string value) 20 | { 21 | RequestParamsRecord[key] = HttpUtility.UrlEncode(value); 22 | } 23 | 24 | public override void SetEndpoint(string endpoint) 25 | { 26 | base.SetEndpoint(endpoint); 27 | 28 | HttpRequestMessage.RequestUri = new Uri($"{Scheme}://{Endpoint}/{ApiPath}?{RequestParamsRecord.Select(x => $"{x.Key}={x.Value}").JoinAsString("&")}"); 29 | 30 | HttpRequestMessage.Headers.Host = Endpoint; 31 | HttpRequestMessage.Headers.Remove("X-TC-Timestamp"); 32 | } 33 | 34 | public override void SetAuthorization(string id, string key) 35 | { 36 | var headers = HttpRequestMessage.Headers.ToDictionary(httpRequestHeader => httpRequestHeader.Key, 37 | httpRequestHeader => httpRequestHeader.Value.First()); 38 | 39 | var sign = QcloudClsSignature.BuildSignature(id, key, HttpRequestMessage.Method.Method, 40 | ApiPath.EnsureStartsWith('/'), RequestParamsRecord, headers, 300000); 41 | 42 | HttpRequestMessage.Headers.TryAddWithoutValidation("Authorization", sign); 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /.github/workflows/publish-docs.yml: -------------------------------------------------------------------------------- 1 | name: publish to easyabp.io 2 | on: 3 | push: 4 | branches: 5 | - master 6 | - main 7 | jobs: 8 | publish: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v5 13 | with: 14 | persist-credentials: false 15 | fetch-depth: 0 16 | 17 | - name: Find and Replace 18 | uses: jacobtomlinson/gha-find-replace@master 19 | with: 20 | find: \]\((/docs/) 21 | replace: "](/modules/${{ github.event.repository.name }}/" 22 | include: docs/**.md 23 | 24 | - name: Pull repo and change files 25 | id: change 26 | run: | 27 | ls 28 | git clone https://github.com/EasyAbp/easyabp.github.io 29 | cd easyabp.github.io 30 | rm -rf docs/modules/${{ github.event.repository.name }} 31 | rm -rf docs/.vuepress/public/modules/${{ github.event.repository.name }} 32 | cp -rf ../docs/ docs/modules/${{ github.event.repository.name }} 33 | cp -rf ../docs/ docs/.vuepress/public/modules/${{ github.event.repository.name }} 34 | git add --all 35 | echo "##[set-output name=diff;]$(git diff --staged)" 36 | - name: Commit files 37 | if: steps.change.outputs.diff 38 | run: | 39 | ls 40 | cd easyabp.github.io 41 | git config --local user.email "action@github.com" 42 | git config --local user.name "GitHub Action" 43 | git commit -m "Update the docs of ${{ github.event.repository.name }}" -a 44 | - name: Push changes 45 | if: steps.change.outputs.diff 46 | uses: ad-m/github-push-action@master 47 | with: 48 | github_token: ${{ secrets.EASYABP_IO_ACCESS_TOKEN }} 49 | repository: EasyAbp/easyabp.github.io 50 | directory: easyabp.github.io 51 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/Statistics/Model/DescribeBillingDataResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CDN.Statistics.Model 5 | { 6 | public class DescribeBillingDataResponse : CommonResponse 7 | { 8 | /// 9 | /// 10 | /// 11 | public string RequestId { get; set; } 12 | 13 | /// 14 | /// 15 | /// 16 | public List Data { get; set; } 17 | 18 | /// 19 | /// 20 | /// 21 | public string Interval { get; set; } 22 | } 23 | 24 | public class DetailDataItem 25 | { 26 | /// 27 | /// 28 | /// 29 | public string Time { get; set; } 30 | 31 | /// 32 | /// 33 | /// 34 | public int Value { get; set; } 35 | } 36 | 37 | public class SummarizedData 38 | { 39 | /// 40 | /// 41 | /// 42 | public string Name { get; set; } 43 | 44 | /// 45 | /// 46 | /// 47 | public int Value { get; set; } 48 | } 49 | 50 | public class BillingDataItem 51 | { 52 | /// 53 | /// 54 | /// 55 | public string Metric { get; set; } 56 | 57 | /// 58 | /// 59 | /// 60 | public List DetailData { get; set; } 61 | 62 | /// 63 | /// 64 | /// 65 | public SummarizedData SummarizedData { get; set; } 66 | } 67 | 68 | public class DataItem 69 | { 70 | /// 71 | /// 72 | /// 73 | public string Resource { get; set; } 74 | 75 | /// 76 | /// 77 | /// 78 | public List BillingData { get; set; } 79 | } 80 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/QCloudImplement/CosServerWrapObject.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using COSXML; 3 | using COSXML.Auth; 4 | using Microsoft.Extensions.Options; 5 | using Volo.Abp.DependencyInjection; 6 | using EasyAbp.Abp.TencentCloud.Common; 7 | 8 | namespace EasyAbp.Abp.TencentCloud.COS.QCloudImplement 9 | { 10 | /// 11 | /// Cos Xml Server 的包装对象。 12 | /// 13 | public class CosServerWrapObject : ISingletonDependency 14 | { 15 | public CosXmlServer CosXmlServer { get; protected set; } 16 | 17 | private readonly AbpTencentCloudCOSOptions _abpTencentCloudCOSOptions; 18 | private readonly AbpTencentCloudCommonOptions _abpTencentCloudCommonOptions; 19 | 20 | public CosServerWrapObject(IOptions abpTencentCloudCOSOptions, 21 | IOptions abpTencentCloudCommonOptions) 22 | { 23 | _abpTencentCloudCommonOptions = abpTencentCloudCommonOptions.Value; 24 | _abpTencentCloudCOSOptions = abpTencentCloudCOSOptions.Value; 25 | 26 | CosXmlServer = new CosXmlServer(BuildConfig(), 27 | GetCredentialProvider()); 28 | } 29 | 30 | private CosXmlConfig BuildConfig() 31 | { 32 | return new CosXmlConfig.Builder() 33 | .SetConnectionLimit(TimeSpan.FromSeconds(_abpTencentCloudCOSOptions.ConnectionTimeout).TotalMilliseconds.To()) 34 | .SetReadWriteTimeoutMs(TimeSpan.FromSeconds(_abpTencentCloudCOSOptions.ReadWriteTimeout).TotalMilliseconds.To()) 35 | .IsHttps(true) 36 | .SetAppid(_abpTencentCloudCommonOptions.AppId) 37 | .SetRegion(_abpTencentCloudCommonOptions.Region) 38 | .SetDebugLog(false) 39 | .Build(); 40 | } 41 | 42 | private QCloudCredentialProvider GetCredentialProvider() 43 | { 44 | return new DefaultQCloudCredentialProvider(_abpTencentCloudCommonOptions.SecretId, 45 | _abpTencentCloudCommonOptions.SecretKey, _abpTencentCloudCOSOptions.KeyDurationSecond); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/Requester/TencentCloudApiRequester.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net.Http; 3 | using System.Threading.Tasks; 4 | using Microsoft.Extensions.Options; 5 | using Newtonsoft.Json.Linq; 6 | using Volo.Abp.DependencyInjection; 7 | using EasyAbp.Abp.TencentCloud.Common.Models; 8 | 9 | namespace EasyAbp.Abp.TencentCloud.Common.Requester 10 | { 11 | public class TencentCloudApiRequester : ITencentCloudApiRequester, ITransientDependency 12 | { 13 | protected HttpClient HttpClient { get; } 14 | protected IHttpClientFactory HttpClientFactory { get; } 15 | 16 | private readonly AbpTencentCloudCommonOptions _sdkCommonOptions; 17 | 18 | public TencentCloudApiRequester(IHttpClientFactory httpClientFactory, IOptions sdkCommonOptions) 19 | { 20 | HttpClientFactory = httpClientFactory; 21 | HttpClient = httpClientFactory.CreateClient(TencentCommonConsts.DefaultHttpClientName); 22 | 23 | _sdkCommonOptions = sdkCommonOptions.Value; 24 | } 25 | 26 | public virtual async Task SendRequestAsync(ICommonRequest request, string endpoint) 27 | where TResponse : ICommonResponse 28 | { 29 | return await SendRequestAsync(request, endpoint, _sdkCommonOptions); 30 | } 31 | 32 | public virtual async Task SendRequestAsync(ICommonRequest request, string endpoint, 33 | AbpTencentCloudCommonOptions options) where TResponse : ICommonResponse 34 | { 35 | request.SetEndpoint(endpoint); 36 | request.SetAuthorization(options.SecretId, options.SecretKey); 37 | request.SetRegion(options.Region); 38 | 39 | using var response = await HttpClient.SendAsync(request.HttpRequestMessage); 40 | 41 | var result = await response.Content.ReadAsStringAsync(); 42 | 43 | return request.ResultRoot.IsNullOrEmpty() 44 | ? JObject.Parse(result).ToObject() 45 | : JObject.Parse(result).SelectToken($"$.{request.ResultRoot}").ToObject(); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudLive.Tests/StatisticsTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Threading.Tasks; 4 | using Shouldly; 5 | using Xunit; 6 | using EasyAbp.Abp.TencentCloud.CloudLive.Statistics.Model; 7 | 8 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Tests 9 | { 10 | public class StatisticsTests : AbpTencentCloudCloudLiveTestBase 11 | { 12 | [Fact] 13 | public async Task DescribeLiveStreamPushInfoListRequest_Test() 14 | { 15 | var resp = await TencentCloudApiRequester.SendRequestAsync( 16 | new DescribeLiveStreamPushInfoListRequest(), 17 | TencentCloudCloudLiveOptions.EndPoint); 18 | 19 | resp.RequestId.ShouldNotBeNull(); 20 | } 21 | 22 | [Fact] 23 | public async Task DescribeStreamPlayInfoListRequest_Test() 24 | { 25 | var resp = await TencentCloudApiRequester.SendRequestAsync( 26 | new DescribeStreamPlayInfoListRequest( 27 | new DateTime(2020, 3, 3, 0, 0, 0).ToString("yyyy-MM-dd HH:mm:ss"), 28 | new DateTime(2020, 3, 4, 0, 0, 0).ToString("yyyy-MM-dd HH:mm:ss"), 29 | null, 30 | "7396CB03-E2C7-4C96-8919-E9BA2FC0D1DC-GD1517841547"), 31 | TencentCloudCloudLiveOptions.EndPoint); 32 | 33 | resp.RequestId.ShouldNotBeNull(); 34 | var allFlux = resp.DataInfoList.Where(x => x.Flux > 0).Sum(x => x.Flux); 35 | var maxBandwidth = resp.DataInfoList.Where(x => x.Bandwidth > 0).Max(x => x.Bandwidth); 36 | } 37 | 38 | [Fact] 39 | public async Task DescribeStreamDayPlayInfoListRequest_Test() 40 | { 41 | var resp = await TencentCloudApiRequester.SendRequestAsync( 42 | new DescribeStreamDayPlayInfoListRequest( 43 | "2020-03-12"), 44 | TencentCloudCloudLiveOptions.EndPoint); 45 | 46 | resp.RequestId.ShouldNotBeNull(); 47 | resp.DataInfoList.Count.ShouldBeGreaterThan(0); 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CAM.Tests/STSTests.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading.Tasks; 3 | using Shouldly; 4 | using Xunit; 5 | using EasyAbp.Abp.TencentCloud.CAM.Infrastructure; 6 | using EasyAbp.Abp.TencentCloud.CAM.STS; 7 | 8 | namespace EasyAbp.Abp.TencentCloud.CAM.Tests 9 | { 10 | public class STSTests : AbpTencentCloudCAMTestBase 11 | { 12 | [Fact] 13 | public async Task GenerateFederationTokenTest() 14 | { 15 | var policy = new Policy 16 | { 17 | Version = "2.0", 18 | Statements = new List 19 | { 20 | new Statement 21 | { 22 | Effect = "allow", 23 | Action = new List 24 | { 25 | "name/cos:PutObject", 26 | "name/cos:PostObject", 27 | "name/cos:InitiateMultipartUpload", 28 | "name/cos:ListMultipartUploads", 29 | "name/cos:ListParts", 30 | "name/cos:UploadPart", 31 | "name/cos:CompleteMultipartUpload", 32 | "name/cos:AbortMultipartUpload", 33 | "name/cos:GetBucket", 34 | "name/cos:HeadObject" 35 | }, 36 | Resource = new List 37 | { 38 | // TODO: 如果是 COS 的话,需要手动构造前缀。 39 | $"qcs::cos:ap-chengdu:uid/{TencentCloudCommonOptions.AppId}:d780c447-3f23-9212-f4d3-39f3d9a69a3e-{TencentCloudCommonOptions.AppId}/*" 40 | } 41 | } 42 | } 43 | }; 44 | 45 | var result = await TencentCloudApiRequester.SendRequestAsync( 46 | new GetFederationTokenRequest( 47 | "ETS", 48 | policy, 49 | 7200), "sts.tencentcloudapi.com" 50 | ); 51 | 52 | result.ShouldNotBeNull(); 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.COS/QCloudImplement/DefaultBucketOperator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using COSXML.Model.Bucket; 4 | using Volo.Abp.DependencyInjection; 5 | using EasyAbp.Abp.TencentCloud.COS.Infrastructure; 6 | 7 | namespace EasyAbp.Abp.TencentCloud.COS.QCloudImplement 8 | { 9 | public class DefaultBucketOperator : IBucketOperator, ITransientDependency 10 | { 11 | protected readonly CosServerWrapObject CosServerWrapObject; 12 | 13 | public DefaultBucketOperator(CosServerWrapObject cosServerWrapObject) 14 | { 15 | CosServerWrapObject = cosServerWrapObject; 16 | } 17 | 18 | public Task CreateAsync(string bucket) 19 | { 20 | var request = CosServerWrapObject.CosXmlServer.PutBucket(new PutBucketRequest(bucket)); 21 | var result = request.GetResultInfo(); 22 | 23 | return Task.FromResult(result); 24 | } 25 | 26 | public Task DeleteAsync(string bucket) 27 | { 28 | var request = CosServerWrapObject.CosXmlServer.DeleteBucket(new DeleteBucketRequest(bucket)); 29 | throw new NotImplementedException(); 30 | } 31 | 32 | public Task ConfigureCorsAsync(string[] sourceOrigin) 33 | { 34 | throw new NotImplementedException(); 35 | } 36 | 37 | public Task GetCorsInfoAsync() 38 | { 39 | throw new NotImplementedException(); 40 | } 41 | 42 | public Task DeleteCorsAsync() 43 | { 44 | throw new NotImplementedException(); 45 | } 46 | 47 | public Task ConfigureLifecycleAsync() 48 | { 49 | throw new NotImplementedException(); 50 | } 51 | 52 | public Task GetLifecycleInfoAsync() 53 | { 54 | throw new NotImplementedException(); 55 | } 56 | 57 | public Task DeleteLifecycleAsync() 58 | { 59 | throw new NotImplementedException(); 60 | } 61 | 62 | public Task ConfigureVersioningAsync() 63 | { 64 | throw new NotImplementedException(); 65 | } 66 | 67 | public Task GetVersioningAsync() 68 | { 69 | throw new NotImplementedException(); 70 | } 71 | 72 | public Task ConfigureReplicationAsync() 73 | { 74 | throw new NotImplementedException(); 75 | } 76 | 77 | public Task GetReplicationAsync() 78 | { 79 | throw new NotImplementedException(); 80 | } 81 | 82 | public Task DeleteReplicationAsync() 83 | { 84 | throw new NotImplementedException(); 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CloudLive/Statistics/Model/DescribeLiveStreamPushInfoListResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CloudLive.Statistics.Model 5 | { 6 | public class DescribeLiveStreamPushInfoListResponse : CommonResponse 7 | { 8 | /// 9 | /// 10 | /// 11 | public List DataInfoList { get; set; } 12 | 13 | /// 14 | /// 15 | /// 16 | public int PageNum { get; set; } 17 | 18 | /// 19 | /// 20 | /// 21 | public int PageSize { get; set; } 22 | 23 | /// 24 | /// 25 | /// 26 | public int TotalNum { get; set; } 27 | 28 | /// 29 | /// 30 | /// 31 | public int TotalPage { get; set; } 32 | } 33 | 34 | public class PushDataInfo 35 | { 36 | /// 37 | /// 38 | /// 39 | public string Acodec { get; set; } 40 | 41 | /// 42 | /// 43 | /// 44 | public string AppName { get; set; } 45 | 46 | /// 47 | /// 48 | /// 49 | public int AsampleRate { get; set; } 50 | 51 | /// 52 | /// 53 | /// 54 | public int AudioFps { get; set; } 55 | 56 | /// 57 | /// 58 | /// 59 | public int AudioSpeed { get; set; } 60 | 61 | /// 62 | /// 63 | /// 64 | public string BeginPushTime { get; set; } 65 | 66 | /// 67 | /// 68 | /// 69 | public string ClientIp { get; set; } 70 | 71 | /// 72 | /// 73 | /// 74 | public string PushDomain { get; set; } 75 | 76 | /// 77 | /// 78 | /// 79 | public string Resolution { get; set; } 80 | 81 | /// 82 | /// 83 | /// 84 | public string ServerIp { get; set; } 85 | 86 | /// 87 | /// 88 | /// 89 | public string StreamName { get; set; } 90 | 91 | /// 92 | /// 93 | /// 94 | public string Vcodec { get; set; } 95 | 96 | /// 97 | /// 98 | /// 99 | public int VideoFps { get; set; } 100 | 101 | /// 102 | /// 103 | /// 104 | public int VideoSpeed { get; set; } 105 | } 106 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/Statistics/Model/DescribeBillingDataRequest.cs: -------------------------------------------------------------------------------- 1 | using EasyAbp.Abp.TencentCloud.Common.Models; 2 | using JetBrains.Annotations; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CDN.Statistics.Model 5 | { 6 | /// 7 | /// 计费数据查询,用于查询实际计费数据明细。 8 | /// 9 | public sealed class DescribeBillingDataRequest : CommonRequest 10 | { 11 | /// 12 | /// 构造一个 对象。 13 | /// 14 | /// 15 | /// 查询起始时间,如: 2018-09-04 10:40:00,返回结果大于等于指定时间。
16 | /// 根据指定时间粒度参数不同,会进行向前取整,如指定起始时间为 2018-09-04 10:40:00 按小时粒度查询,返回的第一个数据对应时间点为 2018-09-04 10:00:00
17 | /// 起始时间与结束时间间隔小于等于 90 天。 18 | /// 19 | /// 20 | /// 查询结束时间,如: 2018-09-04 10:40:00,返回结果小于等于指定时间根据指定时间粒度参数不同,会进行向前取整。
21 | /// 如指定结束时间为 2018-09-04 10:40:00 按小时粒度查询时,返回的最后一个数据对应时间点为 2018-09-04 10:00:00 起始时间与结束时间间隔小于等于 90 天。 22 | /// 23 | /// 24 | /// 时间粒度,支持模式如下:
25 | /// min:1 分钟粒度,查询区间需要小于等于 24 小时。
26 | /// 5min:5 分钟粒度,查询区间需要小于等于 31 天。
27 | /// hour:1 小时粒度,查询区间需要小于等于 31 天内。
28 | /// day:天粒度,查询区间需要大于 31 天。

29 | /// Area 字段为 overseas 时暂不支持1分钟粒度数据查询。 30 | /// 31 | /// 指定域名查询计费数据。 32 | /// 指定项目 ID 查询,若 Domain 参数填充了具体域名信息,则返回该域名的计费数据,而非指定项目计费数据 33 | /// 34 | /// 指定加速区域查询计费数据。
35 | /// mainland: 中国境内。
36 | /// overseas: 中国境外。
37 | /// 不填充时,默认为 mainland 38 | /// 39 | /// 40 | /// Area 为 overseas 时,指定国家/地区查询。
41 | /// 不填充时,查询所有国家/地区。 42 | /// 43 | /// 计费统计类型。
44 | /// flux: 计费流量。
45 | /// bandwidth: 计费带宽。
46 | /// 默认值为 bandwidth。 47 | /// 48 | public DescribeBillingDataRequest([NotNull] string startTime, 49 | [NotNull] string endTime, 50 | [CanBeNull] string interval = null, 51 | [CanBeNull] string domain = null, 52 | long? project = null, 53 | [CanBeNull] string area = null, 54 | [CanBeNull] string district = null, 55 | [CanBeNull] string metric = null) 56 | { 57 | SetAction("DescribeBillingData"); 58 | SetVersion("2018-06-06"); 59 | 60 | SetRequestBody(new 61 | { 62 | StartTime = startTime, 63 | EndTime = endTime, 64 | Interval = interval, 65 | Domain = domain, 66 | Project = project, 67 | Area = area, 68 | District = district, 69 | Metric = metric 70 | }); 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/Statistics/Model/DescribeCdnDataResponse.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using EasyAbp.Abp.TencentCloud.Common.Models; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.CDN.Statistics.Model 6 | { 7 | public class DescribeCdnDataResponse : CommonResponse 8 | { 9 | /// 10 | /// 返回数据的时间粒度,查询时指定。具体值有以下几项:
11 | /// min: 1 分钟粒度。
12 | /// 5min: 5 分钟粒度。
13 | /// hour: 1 小时粒度。
14 | /// day: 天粒度。 15 | ///
16 | public string Interval { get; set; } 17 | 18 | public List Data { get; set; } 19 | } 20 | 21 | public class CdnResourceData 22 | { 23 | /// 24 | /// 资源名称,根据接口查询条件的不同,分为以下几类:
25 | /// 具体域名: 用于表示该域名下面的明细数据。 26 | /// multiDomains: 多域名汇总明细数据。 27 | /// 项目 ID: 指定项目查询时,显示为项目的 ID。 28 | /// all: 账号维度的明细数据。 29 | ///
30 | public string Resource { get; set; } 31 | 32 | /// 33 | /// 资源对应的数据明细,具体参考 类。 34 | /// 35 | public List CdnData { get; set; } 36 | } 37 | 38 | public class CdnDataItem 39 | { 40 | /// 41 | /// 查询指定的指标名称:
42 | /// flux: 流量,单位为 byte。
43 | /// bandwidth: 带宽,单位为 bps。
44 | /// request: 请求数,单位为 次。
45 | /// fluxHitRate: 流量命中率,单位为 %。
46 | /// statusCode: 状态码,返回 2XX、3XX、4XX、5XX 汇总数据,单位为 个。
47 | /// 2XX: 返回 2XX 状态码汇总及各 2 开头状态码数据,单位为 个。
48 | /// 3XX: 返回 3XX 状态码汇总及各 3 开头状态码数据,单位为 个。
49 | /// 4XX: 返回 4XX 状态码汇总及各 4 开头状态码数据,单位为 个。
50 | /// 5XX: 返回 5XX 状态码汇总及各 5 开头状态码数据,单位为 个。
51 | /// 或指定查询的某一具体状态码。 52 | ///
53 | public string Metric { get; set; } 54 | 55 | /// 56 | /// 明细数据的集合。 57 | /// 58 | public List DetailData { get; set; } 59 | 60 | /// 61 | /// 汇总数据。 62 | /// 63 | public CdnSummarizedData SummarizedData { get; set; } 64 | } 65 | 66 | public class CdnTimestampData 67 | { 68 | /// 69 | /// 数据统计时间点,采用向前汇总模式。
70 | /// 以 5 分钟粒度为例,13:35:00 时间点代表的统计数据区间为 13:35:00 至 13:39:59。 71 | ///
72 | public DateTime Time { get; set; } 73 | 74 | /// 75 | /// 数据的具体值。 76 | /// 77 | public float Value { get; set; } 78 | } 79 | 80 | public class CdnSummarizedData 81 | { 82 | /// 83 | /// 汇总方式,存在以下几种:
84 | /// sum: 累加求和。
85 | /// max: 最大值,带宽模式下,采用 5 分钟粒度汇总数据,计算峰值带宽。
86 | /// avg: 平均值。 87 | ///
88 | public string Name { get; set; } 89 | 90 | /// 91 | /// 汇总后的数据值。 92 | /// 93 | public float Value { get; set; } 94 | } 95 | } -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: publish to nuget 2 | on: 3 | push: 4 | branches: 5 | - master 6 | - main 7 | jobs: 8 | publish: 9 | runs-on: ubuntu-22.04 10 | steps: 11 | - uses: actions/checkout@v5 12 | - uses: NuGet/setup-nuget@v2 13 | - uses: actions/setup-dotnet@v5 14 | with: 15 | dotnet-version: '10.0.x' 16 | 17 | - name: read common.props 18 | id: commonProps 19 | uses: juliangruber/read-file-action@v1 20 | with: 21 | path: ./common.props 22 | 23 | - name: get version 24 | id: getVersion 25 | uses: AsasInnab/regex-action@v1 26 | with: 27 | regex_pattern: '(?<=>)[^<>]+(?=)' 28 | regex_flags: 'gim' 29 | search_string: '${{ steps.commonProps.outputs.content }}' 30 | 31 | - name: dotnet restore 32 | run: dotnet restore -s "https://api.nuget.org/v3/index.json" 33 | 34 | - name: dotnet build 35 | run: dotnet build -c Release 36 | 37 | # - name: dotnet test 38 | # run: dotnet test -c Release --no-restore --no-build 39 | 40 | - name: dotnet pack 41 | run: dotnet pack -c Release --no-build --property PackageOutputPath=${{ github.workspace }}/nugetPackages/ 42 | 43 | - name: remove unused packages 44 | run: | 45 | cd ${{ github.workspace }}/nugetPackages 46 | shopt -s extglob 47 | rm -f !(EasyAbp.*) 48 | rm -f !(*.${{ steps.getVersion.outputs.first_match }}.nupkg) 49 | rm -f *.Blazor.Host.* 50 | rm -f *.Blazor.Server.Host.* 51 | rm -f *.Host.Shared.* 52 | rm -f *.HttpApi.Host.* 53 | rm -f *.IdentityServer.* 54 | rm -f *.AuthServer.* 55 | rm -f *.Web.Host.* 56 | rm -f *.Web.Unified.* 57 | rm -f *.HttpApi.Client.ConsoleTestApp.* 58 | rm -f *.Tests.* 59 | rm -f *.TestBase.* 60 | ls 61 | 62 | - name: dotnet nuget push to GitHub 63 | uses: tanaka-takayoshi/nuget-publish-to-github-packages-action@v2.1 64 | with: 65 | nupkg-path: '${{ github.workspace }}/nugetPackages/*.nupkg' 66 | repo-owner: 'EasyAbp' 67 | gh-user: 'EasyAbp' 68 | token: ${{ secrets.GITHUB_TOKEN }} 69 | 70 | - name: dotnet nuget push to NuGet 71 | run: dotnet nuget push ${{ github.workspace }}/nugetPackages/*.nupkg -k ${{secrets.NUGET_API_KEY}} -s https://api.nuget.org/v3/index.json --skip-duplicate 72 | 73 | - name: determine if the tag exists 74 | uses: mukunku/tag-exists-action@v1.0.0 75 | id: checkTag 76 | with: 77 | tag: ${{ steps.getVersion.outputs.first_match }} 78 | env: 79 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 80 | 81 | - name: add git tag 82 | if: ${{ steps.checkTag.outputs.exists == 'false' }} 83 | uses: tvdias/github-tagger@v0.0.1 84 | with: 85 | repo-token: ${{ secrets.GITHUB_TOKEN }} 86 | tag: ${{ steps.getVersion.outputs.first_match }} 87 | -------------------------------------------------------------------------------- /test/EasyAbp.Abp.TencentCloud.CloudMonitor.Tests/GetMonitorDataTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Shouldly; 6 | using Xunit; 7 | using EasyAbp.Abp.TencentCloud.CloudMonitor.BaseMonitor; 8 | 9 | namespace EasyAbp.Abp.TencentCloud.CloudMonitor.Tests 10 | { 11 | public class GetMonitorDataTests : AbpTencentCloudCloudMonitorTestBase 12 | { 13 | [Fact] 14 | public async Task GetCosMonitorDataTest() 15 | { 16 | var result = await TencentCloudApiRequester.SendRequestAsync( 17 | new GetMonitorDataRequest( 18 | new List 19 | { 20 | new Instance 21 | { 22 | Dimensions = new List 23 | { 24 | new Dimension("appid", TencentCloudCommonOptions.AppId) 25 | } 26 | }, 27 | new Instance 28 | { 29 | Dimensions = new List 30 | { 31 | new Dimension("bucket", "246e0ec0-a410-4bfb-b566") 32 | } 33 | } 34 | }, 35 | "QCE/COS", 36 | "InternetTraffic", 37 | 3600, 38 | new DateTime(2020, 3, 3, 0, 0, 0).ToString("yyyy-MM-dd HH:mm:ss"), 39 | new DateTime(2020, 3, 4, 0, 0, 0).ToString("yyyy-MM-dd HH:mm:ss")), 40 | TencentCloudCloudMonitorOptions.EndPoint); 41 | 42 | result.ShouldNotBeNull(); 43 | // 单位是 MB。 44 | var totalFlux = (result.DataPoints.SelectMany(x => x.Values).Sum(x => x) / 1000 / 1000); 45 | totalFlux.ShouldBeGreaterThan(0); 46 | } 47 | 48 | [Fact] 49 | public async Task GetCosSpaceMonitorDataTest() 50 | { 51 | var result = await TencentCloudApiRequester.SendRequestAsync( 52 | new GetMonitorDataRequest( 53 | new List 54 | { 55 | new Instance 56 | { 57 | Dimensions = new List 58 | { 59 | new Dimension("appid", TencentCloudCommonOptions.AppId) 60 | } 61 | }, 62 | new Instance 63 | { 64 | Dimensions = new List 65 | { 66 | new Dimension("bucket", "246e0ec0-a410-4bfb-b566") 67 | } 68 | } 69 | }, 70 | "QCE/COS", 71 | "StdStorage", 72 | 3600 73 | ), 74 | TencentCloudCloudMonitorOptions.EndPoint); 75 | 76 | result.ShouldNotBeNull(); 77 | result.Error.Message.ShouldNotBeNullOrWhiteSpace(); 78 | } 79 | } 80 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/Statistics/Model/ListTopDataRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | using JetBrains.Annotations; 4 | 5 | namespace EasyAbp.Abp.TencentCloud.CDN.Statistics.Model 6 | { 7 | /// 8 | /// Top 数据查询,仅支持查询 90 天内的数据。
9 | /// QPS: 20 次/秒。 10 | ///
11 | public class ListTopDataRequest : CommonRequest 12 | { 13 | /// 14 | /// 构建一个新的 请求。 15 | /// 16 | /// 17 | /// 查询起始时间,如:2018-09-04 10:40:00,返回结果大于等于指定时间。
18 | /// 根据指定时间粒度不同,会进行向前归整,如 2018-09-04 10:40:00 在按 1 小时的时间粒度查询时,返回的第一个数据对应时间点为 2018-09-04 10:00:00。
19 | /// 起始时间与结束时间间隔小于等于 90 天。 20 | /// 21 | /// 22 | /// 查询结束时间,如:2018-09-04 10:40:00,返回结果小于等于指定时间。
23 | /// 根据指定时间粒度不同,会进行向前归整,如 2018-09-04 10:40:00 在按 1 小时的时间粒度查询时,返回的最后一个数据对应时间点为 2018-09-04 10:00:00。
24 | /// 起始时间与结束时间间隔小于等于 90 天。 25 | /// 26 | /// 排序对象,具体内容可以参考 。 27 | /// 排序使用的指标名称,具体内容可以参考 。 28 | /// 指定查询域名列表,最多可一次性查询 30 个加速域名明细。 29 | /// 指定要查询的项目 ID,前往查看项目 ID 未填充域名情况下,指定项目查询,若填充了具体域名信息,以域名为主。 30 | /// 31 | /// 多域名查询时,默认为 false 返回所有域名汇总排序结果 Metric 为 url、path、district、isp。
32 | /// Filter 为 flux、request 时,可设置为 true,返回每一个 Domain 的排序数据。 33 | /// 34 | /// Filter 为 statusCode、OriginStatusCode 时,填充指定状态码查询排序结果。 35 | /// 36 | /// 指定服务地域查询,不填充表示查询中国境内 CDN 数据。
37 | /// mainland: 指定查询中国境内 CDN 数据。
38 | /// overseas: 指定查询中国境外 CDN 数据,支持的 Metric 为 url、district、host、originHost。
39 | /// 当 Metric 为 originHost 时仅支持 flux、request、bandwidth Filter。 40 | /// 41 | /// 42 | /// 查询中国境外CDN数据,且仅当 Metric 为 district 或 host 时,可指定地区类型查询,不填充表示查询服务地区数据(仅在 Area 为 overseas,且 Metric 是 district 或 host 时可用)。
43 | /// server: 指定查询服务地区(腾讯云 CDN 节点服务器所在地区)数据。
44 | /// client: 指定查询客户端地区(用户请求终端所在地区)数据,当 Metric 为 host 时仅支持 flux、request、bandwidth Filter。 45 | /// 46 | public ListTopDataRequest(string startTime, 47 | string endTime, 48 | string metric, 49 | string filter, 50 | List domains = null, 51 | long? project = null, 52 | bool? detail = null, 53 | [CanBeNull] string code = null, 54 | [CanBeNull] string area = null, 55 | [CanBeNull] string areaType = null) 56 | { 57 | SetAction("ListTopData"); 58 | SetVersion("2018-06-06"); 59 | 60 | SetRequestBody(new 61 | { 62 | StartTime = startTime, 63 | EndTime = endTime, 64 | Metric = metric, 65 | Filter = filter, 66 | Domains = domains, 67 | Project = project, 68 | Detail = detail, 69 | Code = code, 70 | Area = area, 71 | AreaType = areaType 72 | }); 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.CDN/Statistics/Model/DescribeCdnDataRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EasyAbp.Abp.TencentCloud.Common.Models; 3 | 4 | namespace EasyAbp.Abp.TencentCloud.CDN.Statistics.Model 5 | { 6 | /// 7 | /// 用于查询 CDN 实时访问监控数据。 8 | /// 9 | public class DescribeCdnDataRequest : CommonRequest 10 | { 11 | /// 12 | /// 构造一个新的 请求。 13 | /// 14 | /// 15 | /// 查询起始时间,如:2018-09-04 10:40:00,返回结果大于等于指定时间。
16 | /// 根据指定时间粒度不同,会进行向前归整,如 2018-09-04 10:40:00 在按 1 小时的时间粒度查询时,返回的第一个数据对应时间点为 2018-09-04 10:00:00。
17 | /// 起始时间与结束时间间隔小于等于 90 天。 18 | /// 19 | /// 20 | /// 查询结束时间,如:2018-09-04 10:40:00,返回结果小于等于指定时间。
21 | /// 根据指定时间粒度不同,会进行向前归整,如 2018-09-04 10:40:00 在按 1 小时的时间粒度查询时,返回的最后一个数据对应时间点为 2018-09-04 10:00:00。
22 | /// 起始时间与结束时间间隔小于等于 90 天。 23 | /// 24 | /// 25 | /// 指定查询指标,支持的查询类型定义参考 类。
26 | /// 状态码可以指定具体的进行查询,例如 204 等。 27 | /// 28 | /// 指定查询域名列表,最多可一次性查询 30 个加速域名明细。 29 | /// 30 | /// 指定要查询的项目 ID。
31 | /// 未填充域名情况下,指定项目查询,若填充了具体域名信息,以域名为主。 32 | /// 33 | /// 34 | /// 时间粒度,支持模式如下:
35 | /// min:1 分钟粒度,查询区间需要小于等于 24 小时。
36 | /// 5min:5 分钟粒度,查询区间需要小于等于 31 天。
37 | /// hour:1 小时粒度,查询区间需要小于等于 31 天内。
38 | /// day:天粒度,查询区间需要大于 31 天。
39 | /// Area 字段为 overseas 时暂不支持1分钟粒度数据查询。 40 | /// 41 | /// 42 | /// 多域名查询时,默认(false)返回多个域名的汇总数据。
43 | /// 可按需指定为 true,返回每一个 Domain 的明细数据(statusCode 指标暂不支持)。 44 | /// 45 | /// 46 | /// 查询中国境内CDN数据时,指定运营商查询,不填充表示查询所有运营商。
47 | /// 指定运营商查询时,不可同时指定省份、IP协议查询。 48 | /// 49 | /// 50 | /// 查询中国境内CDN数据时,指定省份查询,不填充表示查询所有省份。
51 | /// 查询中国境外CDN数据时,指定国家/地区查询,不填充表示查询所有国家/地区。
52 | /// 指定(中国境内)省份查询时,不可同时指定运营商、IP协议查询。 53 | /// 54 | /// 55 | /// 指定协议查询,不填充表示查询所有协议。
56 | /// all: 所有协议。
57 | /// http: 指定查询 HTTP 对应指标。
58 | /// https: 指定查询 HTTPS 对应指标。 59 | /// 60 | /// 指定数据源查询,白名单功能。 61 | /// 62 | /// 指定IP协议查询,不填充表示查询所有协议。
63 | /// all: 所有协议。
64 | /// ipv4: 指定查询 ipv4 对应指标。
65 | /// ipv6: 指定查询 ipv6 对应指标。
66 | /// 指定IP协议查询时,不可同时指定省份、运营商查询。
67 | /// 注意: 非IPv6白名单用户不可指定 ipv4、ipv6 进行查询。 68 | /// 69 | /// 70 | /// 指定服务地域查询,不填充表示查询中国境内 CDN 数据。
71 | /// mainland: 指定查询中国境内 CDN 数据。
72 | /// overseas: 指定查询中国境外 CDN 数据。 73 | /// 74 | /// 75 | /// 查询中国境外CDN数据时,可指定地区类型查询,不填充表示查询服务地区数据(仅在 Area 为 overseas 时可用)。
76 | /// server: 指定查询服务地区(腾讯云 CDN 节点服务器所在地区)数据。
77 | /// client: 指定查询客户端地区(用户请求终端所在地区)数据。 78 | /// 79 | public DescribeCdnDataRequest(string startTime, 80 | string endTime, 81 | string metric, 82 | IEnumerable domains = null, 83 | int? project = null, 84 | string interval = null, 85 | bool? detail = null, 86 | int? isp = null, 87 | int? district = null, 88 | string protocol = null, 89 | string dataSource = null, 90 | string ipProtocol = null, 91 | string area = null, 92 | string areaType = null) 93 | { 94 | SetAction("DescribeCdnData"); 95 | SetVersion("2018-06-06"); 96 | SetRequestBody(new 97 | { 98 | StartTime = startTime, 99 | EndTime = endTime, 100 | Metric = metric, 101 | Domains = domains, 102 | Project = project, 103 | Interval = interval, 104 | Detail = detail, 105 | Isp = isp, 106 | District = district, 107 | Protocol = protocol, 108 | DataSource = dataSource, 109 | IpProtocol = ipProtocol, 110 | Area = area, 111 | AreaType = areaType 112 | }); 113 | } 114 | } 115 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | *.VC.db 84 | *.VC.VC.opendb 85 | 86 | # Visual Studio profiler 87 | *.psess 88 | *.vsp 89 | *.vspx 90 | *.sap 91 | 92 | # TFS 2012 Local Workspace 93 | $tf/ 94 | 95 | # Guidance Automation Toolkit 96 | *.gpState 97 | 98 | # ReSharper is a .NET coding add-in 99 | _ReSharper*/ 100 | *.[Rr]e[Ss]harper 101 | *.DotSettings.user 102 | 103 | # JustCode is a .NET coding add-in 104 | .JustCode 105 | 106 | # TeamCity is a build add-in 107 | _TeamCity* 108 | 109 | # DotCover is a Code Coverage Tool 110 | *.dotCover 111 | 112 | # NCrunch 113 | _NCrunch_* 114 | .*crunch*.local.xml 115 | nCrunchTemp_* 116 | 117 | # MightyMoose 118 | *.mm.* 119 | AutoTest.Net/ 120 | 121 | # Web workbench (sass) 122 | .sass-cache/ 123 | 124 | # Installshield output folder 125 | [Ee]xpress/ 126 | 127 | # DocProject is a documentation generator add-in 128 | DocProject/buildhelp/ 129 | DocProject/Help/*.HxT 130 | DocProject/Help/*.HxC 131 | DocProject/Help/*.hhc 132 | DocProject/Help/*.hhk 133 | DocProject/Help/*.hhp 134 | DocProject/Help/Html2 135 | DocProject/Help/html 136 | 137 | # Click-Once directory 138 | publish/ 139 | 140 | # Publish Web Output 141 | *.[Pp]ublish.xml 142 | *.azurePubxml 143 | # TODO: Comment the next line if you want to checkin your web deploy settings 144 | # but database connection strings (with potential passwords) will be unencrypted 145 | *.pubxml 146 | *.publishproj 147 | 148 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 149 | # checkin your Azure Web App publish settings, but sensitive information contained 150 | # in these scripts will be unencrypted 151 | PublishScripts/ 152 | 153 | # NuGet Packages 154 | *.nupkg 155 | # The packages folder can be ignored because of Package Restore 156 | **/packages/* 157 | # except build/, which is used as an MSBuild target. 158 | !**/packages/build/ 159 | # Uncomment if necessary however generally it will be regenerated when needed 160 | #!**/packages/repositories.config 161 | # NuGet v3's project.json files produces more ignoreable files 162 | *.nuget.props 163 | *.nuget.targets 164 | 165 | # Microsoft Azure Build Output 166 | csx/ 167 | *.build.csdef 168 | 169 | # Microsoft Azure Emulator 170 | ecf/ 171 | rcf/ 172 | 173 | # Windows Store app package directories and files 174 | AppPackages/ 175 | BundleArtifacts/ 176 | Package.StoreAssociation.xml 177 | _pkginfo.txt 178 | 179 | # Visual Studio cache files 180 | # files ending in .cache can be ignored 181 | *.[Cc]ache 182 | # but keep track of directories ending in .cache 183 | !*.[Cc]ache/ 184 | 185 | # Others 186 | ClientBin/ 187 | ~$* 188 | *~ 189 | *.dbmdl 190 | *.dbproj.schemaview 191 | *.pfx 192 | *.publishsettings 193 | node_modules/ 194 | orleans.codegen.cs 195 | 196 | # Since there are multiple workflows, uncomment next line to ignore bower_components 197 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 198 | #bower_components/ 199 | 200 | # RIA/Silverlight projects 201 | Generated_Code/ 202 | 203 | # Backup & report files from converting an old project file 204 | # to a newer Visual Studio version. Backup files are not needed, 205 | # because we have git ;-) 206 | _UpgradeReport_Files/ 207 | Backup*/ 208 | UpgradeLog*.XML 209 | UpgradeLog*.htm 210 | 211 | # SQL Server files 212 | *.mdf 213 | *.ldf 214 | 215 | # Business Intelligence projects 216 | *.rdl.data 217 | *.bim.layout 218 | *.bim_*.settings 219 | 220 | # Microsoft Fakes 221 | FakesAssemblies/ 222 | 223 | # GhostDoc plugin setting file 224 | *.GhostDoc.xml 225 | 226 | # Node.js Tools for Visual Studio 227 | .ntvs_analysis.dat 228 | 229 | # Visual Studio 6 build log 230 | *.plg 231 | 232 | # Visual Studio 6 workspace options file 233 | *.opt 234 | 235 | # Visual Studio LightSwitch build output 236 | **/*.HTMLClient/GeneratedArtifacts 237 | **/*.DesktopClient/GeneratedArtifacts 238 | **/*.DesktopClient/ModelManifest.xml 239 | **/*.Server/GeneratedArtifacts 240 | **/*.Server/ModelManifest.xml 241 | _Pvt_Extensions 242 | 243 | # Paket dependency manager 244 | .paket/paket.exe 245 | paket-files/ 246 | 247 | # FAKE - F# Make 248 | .fake/ 249 | 250 | # JetBrains Rider 251 | .idea/ 252 | *.sln.iml 253 | -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Common/Models/CommonRequest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Net.Http; 4 | using System.Net.Http.Headers; 5 | using System.Text; 6 | using Newtonsoft.Json; 7 | 8 | namespace EasyAbp.Abp.TencentCloud.Common.Models 9 | { 10 | public abstract class CommonRequest : ICommonRequest 11 | { 12 | public virtual string ResultRoot { get; } = "Response"; 13 | 14 | public HttpRequestMessage HttpRequestMessage { get; } 15 | 16 | protected string Endpoint { get; private set; } 17 | 18 | protected string Scheme { get; private set; } 19 | 20 | protected string ApiPath { get; private set; } 21 | 22 | protected string RequestBody { get; private set; } 23 | 24 | protected Dictionary RequestParamsRecord { get; private set; } = new(); 25 | 26 | protected string ServiceName 27 | { 28 | get 29 | { 30 | if (string.IsNullOrEmpty(Endpoint)) throw new ArgumentNullException(nameof(Endpoint), "终端点地址不能够为空。"); 31 | var data = Endpoint.Split('.'); 32 | if (data.Length <= 0) throw new ArgumentOutOfRangeException(nameof(Endpoint), "终端点地址不正确。"); 33 | return data[0]; 34 | } 35 | } 36 | 37 | protected long Timestamp { get; } 38 | 39 | public CommonRequest(string apiPath = null, string scheme = "https") 40 | { 41 | ApiPath = apiPath; 42 | 43 | Scheme = scheme; 44 | 45 | Timestamp = DateTimeExtensions.GetUtcUnixTimestamp(); 46 | 47 | HttpRequestMessage = new HttpRequestMessage 48 | { 49 | Method = HttpMethod.Post, 50 | }; 51 | HttpRequestMessage.Headers.Add("X-TC-Timestamp", Timestamp.ToString()); 52 | } 53 | 54 | public virtual void SetAction(string action) => HttpRequestMessage.Headers.Add("X-TC-Action", action); 55 | 56 | public virtual void SetRegion(string region) => HttpRequestMessage.Headers.Add("X-TC-Region", region); 57 | 58 | public virtual void SetVersion(string version) => HttpRequestMessage.Headers.Add("X-TC-Version", version); 59 | 60 | public virtual void SetToken(string token) => HttpRequestMessage.Headers.Add("X-TC-Token", token); 61 | 62 | public virtual void SetEndpoint(string endpoint) 63 | { 64 | Endpoint = endpoint; 65 | 66 | HttpRequestMessage.RequestUri = new Uri($"{Scheme}://{Endpoint}/{ApiPath}"); 67 | } 68 | 69 | protected virtual string BuildPayloadSign() => RequestBody.ToSha256(); 70 | 71 | /// 72 | /// 获得凭证范围字符串。 73 | /// 74 | protected virtual string GetCredentialScopeString(long timestamp) => new StringBuilder() 75 | .Append(DateTimeExtensions.GetUtcDate(timestamp).ToString("yyyy-MM-dd")).Append('/') 76 | .Append(ServiceName).Append('/') 77 | .Append("tc3_request") 78 | .ToString(); 79 | 80 | /// 81 | /// 获得需要签名的头部信息。 82 | /// 83 | /// 84 | protected virtual string GetSignedHeaders() => "content-type;host"; 85 | 86 | /// 87 | /// 拼接规范请求字符串。 88 | /// 89 | protected virtual string BuildCanonicalRequest() 90 | { 91 | if (HttpRequestMessage.Method != HttpMethod.Post) 92 | { 93 | throw new InvalidOperationException("目前本 SDK 仅支持 POST 请求方式。"); 94 | } 95 | 96 | var sb = new StringBuilder(); 97 | sb.Append("POST").Append('\n') 98 | .Append('/').Append('\n').Append('\n') 99 | // .Append("content-type:").Append("application/json; ").Append("charset=utf-8").Append('\n') 100 | .Append("content-type:").Append("application/json").Append('\n') 101 | .Append("host:").Append(Endpoint).Append('\n').Append('\n') 102 | .Append(GetSignedHeaders()).Append('\n') 103 | .Append(BuildPayloadSign()); 104 | 105 | return sb.ToString(); 106 | } 107 | 108 | /// 109 | /// 拼接待签名字符串。 110 | /// 111 | protected virtual string BuildWaitSignatureString() 112 | { 113 | return new StringBuilder() 114 | .Append("TC3-HMAC-SHA256").Append('\n') 115 | .Append(Timestamp.ToString()).Append('\n') 116 | .Append(GetCredentialScopeString(Timestamp)).Append('\n') 117 | .Append(BuildCanonicalRequest().ToSha256()) 118 | .ToString(); 119 | } 120 | 121 | /// 122 | /// 构建签名字符串。 123 | /// 124 | /// 需要的 Secret Key。 125 | protected virtual string BuildSignature(string key) 126 | { 127 | var tc3SecretKey = Encoding.UTF8.GetBytes($"TC3{key}"); 128 | 129 | var secretDate = StringExtensions.HmacSha256(tc3SecretKey, DateTimeExtensions.GetUtcDate(Timestamp).ToString("yyyy-MM-dd")); 130 | var secretService = StringExtensions.HmacSha256(secretDate, ServiceName); 131 | var secretSigning = StringExtensions.HmacSha256(secretService, "tc3_request"); 132 | var signatureBytes = StringExtensions.HmacSha256(secretSigning, BuildWaitSignatureString()); 133 | 134 | return BitConverter.ToString(signatureBytes).Replace("-", "").ToLower(); 135 | } 136 | 137 | public virtual void SetAuthorization(string id, string key) 138 | { 139 | var sb = new StringBuilder(); 140 | sb.Append("TC3-HMAC-SHA256").Append(" ") 141 | .Append("Credential=").Append(id).Append('/').Append(GetCredentialScopeString(Timestamp)).Append(", ") 142 | .Append("SignedHeaders=").Append(GetSignedHeaders()).Append(", ") 143 | .Append("Signature=").Append(BuildSignature(key)); 144 | 145 | HttpRequestMessage.Headers.TryAddWithoutValidation("Authorization", sb.ToString()); 146 | } 147 | 148 | protected void SetRequestBody(object paramsObj) 149 | { 150 | RequestBody = JsonConvert.SerializeObject(paramsObj, new JsonSerializerSettings 151 | { 152 | NullValueHandling = NullValueHandling.Ignore 153 | }); 154 | 155 | RequestParamsRecord = JsonConvert.DeserializeObject>(RequestBody); 156 | 157 | HttpRequestMessage.Content = new StringContent(RequestBody); 158 | HttpRequestMessage.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); 159 | HttpRequestMessage.Content.Headers.Add("charset", "utf-8"); 160 | } 161 | } 162 | } -------------------------------------------------------------------------------- /src/EasyAbp.Abp.TencentCloud.Cls/LogManagement/QcloudClsSignature.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Security.Cryptography; 5 | using System.Text; 6 | 7 | namespace EasyAbp.Abp.TencentCloud.Cls.LogManagement 8 | { 9 | class QcloudClsSignature 10 | { 11 | public const string Q_SIGN_ALGORITHM = "q-sign-algorithm"; 12 | 13 | public const string Q_AK = "q-ak"; 14 | 15 | public const string Q_SIGN_TIME = "q-sign-time"; 16 | 17 | public const string Q_KEY_TIME = "q-key-time"; 18 | 19 | public const string Q_HEADER_LIST = "q-header-list"; 20 | 21 | public const string Q_URL_PARAM_LIST = "q-url-param-list"; 22 | 23 | public const string Q_SIGNATURE = "q-signature"; 24 | 25 | public const string SHA1 = "sha1"; 26 | 27 | public const string URLAllowChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"; 28 | 29 | public static string UrlEncode(string value) 30 | { 31 | if (String.IsNullOrEmpty(value)) return String.Empty; 32 | StringBuilder result = new StringBuilder(value.Length * 2); // %xy%xy 33 | byte[] strToBytes = Encoding.UTF8.GetBytes(value); 34 | foreach (byte b in strToBytes) 35 | { 36 | char ch = (char)b; 37 | if (URLAllowChars.IndexOf(ch) != -1) 38 | { 39 | result.Append(ch); 40 | } 41 | else 42 | { 43 | result.Append('%').Append(String.Format(CultureInfo.InvariantCulture, "{0:X2}", (int)b)); 44 | } 45 | } 46 | return result.ToString(); 47 | } 48 | 49 | public static string[] ParamsEncodeList(List keys, Dictionary dict, bool isNeedEncode) 50 | { 51 | StringBuilder resultBuilder = new StringBuilder(); 52 | StringBuilder keyResultBuilder = new StringBuilder(); 53 | foreach (string key in keys) 54 | { 55 | string value = dict[key]; 56 | if (isNeedEncode) resultBuilder.Append(key).Append('=').Append(UrlEncode(value)).Append('&'); 57 | else resultBuilder.Append(key).Append('=').Append(value).Append('&'); 58 | keyResultBuilder.Append(key).Append(';'); 59 | } 60 | string result = resultBuilder.ToString(); 61 | string keyResult = keyResultBuilder.ToString(); 62 | if (result.EndsWith("&", StringComparison.OrdinalIgnoreCase)) 63 | { 64 | result = result.Substring(0, result.Length - 1); 65 | keyResult = keyResult.Substring(0, keyResult.Length - 1); 66 | return new string[] { result, keyResult }; 67 | } 68 | return new string[] { "", "" }; 69 | } 70 | 71 | public static string GetSha1ToHexString(byte[] content) 72 | { 73 | SHA1 sha1 = new SHA1CryptoServiceProvider(); 74 | byte[] result = sha1.ComputeHash(content); 75 | sha1.Clear(); 76 | var hexStr = new StringBuilder(); 77 | foreach (byte b in result) 78 | { 79 | hexStr.Append(b.ToString("x2")); // to lower 80 | } 81 | return hexStr.ToString(); 82 | } 83 | 84 | public static string GetHamcSha1ToHexString(string key, string content) 85 | { 86 | HMACSHA1 hmacSha1 = new HMACSHA1(Encoding.UTF8.GetBytes(key)); 87 | byte[] result = hmacSha1.ComputeHash(Encoding.UTF8.GetBytes(content)); 88 | hmacSha1.Clear(); 89 | var hexStr = new StringBuilder(); 90 | foreach (byte b in result) 91 | { 92 | hexStr.Append(b.ToString("x2")); // to lower 93 | } 94 | 95 | return hexStr.ToString(); 96 | } 97 | 98 | public static string BuildSignature(string secretId, string secretKey, string method, string path, Dictionary @params, Dictionary headers, long expire) 99 | { 100 | StringBuilder formatString = new StringBuilder(); 101 | formatString.Append(method.ToLower()).Append('\n'); // method 102 | formatString.Append(path).Append('\n'); // path 103 | 104 | Dictionary filteredParms = new Dictionary(); 105 | List parmKeys = new List(); 106 | foreach (KeyValuePair kv in @params) 107 | { 108 | parmKeys.Add(kv.Key.ToLower()); 109 | filteredParms[kv.Key.ToLower()] = kv.Value.ToString(); 110 | } 111 | parmKeys.Sort(delegate(string x, string y) { return string.Compare(x, y); }); 112 | 113 | Dictionary filteredHeaders = new Dictionary(); 114 | List headerKeys = new List(); 115 | foreach (KeyValuePair kv in headers) 116 | { 117 | string lowerKey = kv.Key.ToLower(); 118 | if (lowerKey.Equals("content-type") || lowerKey.Equals("content-md5") || lowerKey.Equals("host") || lowerKey[0] == 'x') 119 | { 120 | headerKeys.Add(lowerKey); 121 | filteredHeaders[lowerKey] = kv.Value; 122 | } 123 | } 124 | headerKeys.Sort(delegate(string x, string y) { return string.Compare(x, y); }); 125 | string[] headerResult = ParamsEncodeList(headerKeys, filteredHeaders, true); 126 | string[] parameterResult = ParamsEncodeList(parmKeys, filteredParms, false); 127 | formatString.Append(parameterResult[0]).Append('\n').Append(headerResult[0]).Append('\n'); 128 | long now = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds / 1000; 129 | string signTime = (now - 60).ToString() + ";" + (now + expire / 1000).ToString(); 130 | // signTime = "1510109254;1510109314"; 131 | StringBuilder stringToSign = new StringBuilder(); 132 | stringToSign.Append(SHA1).Append("\n").Append(signTime).Append('\n') 133 | .Append(GetSha1ToHexString(Encoding.UTF8.GetBytes(formatString.ToString()))).Append('\n'); 134 | string signKey = GetHamcSha1ToHexString(secretKey, signTime); 135 | StringBuilder signBuilder = new StringBuilder(); 136 | signBuilder.Append(Q_SIGN_ALGORITHM).Append('=').Append(SHA1).Append('&') 137 | .Append(Q_AK).Append('=').Append(secretId).Append('&') 138 | .Append(Q_SIGN_TIME).Append('=').Append(signTime).Append('&') 139 | .Append(Q_KEY_TIME).Append('=').Append(signTime).Append('&') 140 | .Append(Q_HEADER_LIST).Append('=').Append(headerResult[1]).Append('&') 141 | .Append(Q_URL_PARAM_LIST).Append('=').Append(parameterResult[1]).Append('&') 142 | .Append(Q_SIGNATURE).Append('=').Append(GetHamcSha1ToHexString(signKey, stringToSign.ToString())); 143 | return signBuilder.ToString(); 144 | } 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /EasyAbp.Abp.TencentCloud.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.9.34728.123 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{FA809AD0-F6C9-4E21-91FA-A7D859721C0E}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1EC08153-A99B-4661-AF45-7AA674AF0863}" 9 | EndProject 10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.Common", "src\EasyAbp.Abp.TencentCloud.Common\EasyAbp.Abp.TencentCloud.Common.csproj", "{817EF494-7C55-4073-9BC2-791873A5997B}" 11 | EndProject 12 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.CloudLive", "src\EasyAbp.Abp.TencentCloud.CloudLive\EasyAbp.Abp.TencentCloud.CloudLive.csproj", "{E17020B3-FEFF-49D6-B391-F4E72E3C2743}" 13 | EndProject 14 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.CloudLive.Tests", "test\EasyAbp.Abp.TencentCloud.CloudLive.Tests\EasyAbp.Abp.TencentCloud.CloudLive.Tests.csproj", "{F3851B0C-605B-4640-B38E-51E9FAEE284C}" 15 | EndProject 16 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.TestBase", "test\EasyAbp.Abp.TencentCloud.TestBase\EasyAbp.Abp.TencentCloud.TestBase.csproj", "{1438236B-639F-49F2-AA47-8299671BD096}" 17 | EndProject 18 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.COS", "src\EasyAbp.Abp.TencentCloud.COS\EasyAbp.Abp.TencentCloud.COS.csproj", "{24522BE7-54F7-4CB8-9FE0-1E58E6A170B9}" 19 | EndProject 20 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.CloudMonitor", "src\EasyAbp.Abp.TencentCloud.CloudMonitor\EasyAbp.Abp.TencentCloud.CloudMonitor.csproj", "{F4427E96-6D6D-4AC0-89BA-12CB573B2D13}" 21 | EndProject 22 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.CloudMonitor.Tests", "test\EasyAbp.Abp.TencentCloud.CloudMonitor.Tests\EasyAbp.Abp.TencentCloud.CloudMonitor.Tests.csproj", "{C2EB6F80-AEBE-46E4-9F7A-4768C58BFFC8}" 23 | EndProject 24 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.CAM", "src\EasyAbp.Abp.TencentCloud.CAM\EasyAbp.Abp.TencentCloud.CAM.csproj", "{80EEDFAF-5360-42A8-AB56-8DF504AD9C45}" 25 | EndProject 26 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.CAM.Tests", "test\EasyAbp.Abp.TencentCloud.CAM.Tests\EasyAbp.Abp.TencentCloud.CAM.Tests.csproj", "{426EB78E-6488-4D89-83A2-545CBDDDA3F8}" 27 | EndProject 28 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.COS.Tests", "test\EasyAbp.Abp.TencentCloud.COS.Tests\EasyAbp.Abp.TencentCloud.COS.Tests.csproj", "{5DF73C10-0BC4-4D9B-80FF-8CCFF35E7B58}" 29 | EndProject 30 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.Sms", "src\EasyAbp.Abp.TencentCloud.Sms\EasyAbp.Abp.TencentCloud.Sms.csproj", "{0C752FFB-C212-41BD-9ACB-914B145FB135}" 31 | EndProject 32 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.Sms.Tests", "test\EasyAbp.Abp.TencentCloud.Sms.Tests\EasyAbp.Abp.TencentCloud.Sms.Tests.csproj", "{361CC010-0896-4AD5-961B-00D015D8C58C}" 33 | EndProject 34 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.CDN", "src\EasyAbp.Abp.TencentCloud.CDN\EasyAbp.Abp.TencentCloud.CDN.csproj", "{AC37CA9C-EC46-4164-A556-10A0ADF83558}" 35 | EndProject 36 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.Cls", "src\EasyAbp.Abp.TencentCloud.Cls\EasyAbp.Abp.TencentCloud.Cls.csproj", "{BEEA8068-D3A9-4D5E-9EBC-E976EECB3456}" 37 | EndProject 38 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyAbp.Abp.TencentCloud.Cls.Tests", "test\EasyAbp.Abp.TencentCloud.Cls.Tests\EasyAbp.Abp.TencentCloud.Cls.Tests.csproj", "{1647547B-F3A5-46B4-A856-CFC959B999A4}" 39 | EndProject 40 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.Abp.TencentCloud.Captcha", "src\EasyAbp.Abp.TencentCloud.Captcha\EasyAbp.Abp.TencentCloud.Captcha.csproj", "{81CC8290-EBE0-4F50-BAA1-EDD31F79723F}" 41 | EndProject 42 | Global 43 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 44 | Debug|Any CPU = Debug|Any CPU 45 | Release|Any CPU = Release|Any CPU 46 | EndGlobalSection 47 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 48 | {817EF494-7C55-4073-9BC2-791873A5997B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 49 | {817EF494-7C55-4073-9BC2-791873A5997B}.Debug|Any CPU.Build.0 = Debug|Any CPU 50 | {817EF494-7C55-4073-9BC2-791873A5997B}.Release|Any CPU.ActiveCfg = Release|Any CPU 51 | {817EF494-7C55-4073-9BC2-791873A5997B}.Release|Any CPU.Build.0 = Release|Any CPU 52 | {E17020B3-FEFF-49D6-B391-F4E72E3C2743}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 53 | {E17020B3-FEFF-49D6-B391-F4E72E3C2743}.Debug|Any CPU.Build.0 = Debug|Any CPU 54 | {E17020B3-FEFF-49D6-B391-F4E72E3C2743}.Release|Any CPU.ActiveCfg = Release|Any CPU 55 | {E17020B3-FEFF-49D6-B391-F4E72E3C2743}.Release|Any CPU.Build.0 = Release|Any CPU 56 | {F3851B0C-605B-4640-B38E-51E9FAEE284C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 57 | {F3851B0C-605B-4640-B38E-51E9FAEE284C}.Debug|Any CPU.Build.0 = Debug|Any CPU 58 | {F3851B0C-605B-4640-B38E-51E9FAEE284C}.Release|Any CPU.ActiveCfg = Release|Any CPU 59 | {F3851B0C-605B-4640-B38E-51E9FAEE284C}.Release|Any CPU.Build.0 = Release|Any CPU 60 | {1438236B-639F-49F2-AA47-8299671BD096}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 61 | {1438236B-639F-49F2-AA47-8299671BD096}.Debug|Any CPU.Build.0 = Debug|Any CPU 62 | {1438236B-639F-49F2-AA47-8299671BD096}.Release|Any CPU.ActiveCfg = Release|Any CPU 63 | {1438236B-639F-49F2-AA47-8299671BD096}.Release|Any CPU.Build.0 = Release|Any CPU 64 | {24522BE7-54F7-4CB8-9FE0-1E58E6A170B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 65 | {24522BE7-54F7-4CB8-9FE0-1E58E6A170B9}.Debug|Any CPU.Build.0 = Debug|Any CPU 66 | {24522BE7-54F7-4CB8-9FE0-1E58E6A170B9}.Release|Any CPU.ActiveCfg = Release|Any CPU 67 | {24522BE7-54F7-4CB8-9FE0-1E58E6A170B9}.Release|Any CPU.Build.0 = Release|Any CPU 68 | {F4427E96-6D6D-4AC0-89BA-12CB573B2D13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 69 | {F4427E96-6D6D-4AC0-89BA-12CB573B2D13}.Debug|Any CPU.Build.0 = Debug|Any CPU 70 | {F4427E96-6D6D-4AC0-89BA-12CB573B2D13}.Release|Any CPU.ActiveCfg = Release|Any CPU 71 | {F4427E96-6D6D-4AC0-89BA-12CB573B2D13}.Release|Any CPU.Build.0 = Release|Any CPU 72 | {C2EB6F80-AEBE-46E4-9F7A-4768C58BFFC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 73 | {C2EB6F80-AEBE-46E4-9F7A-4768C58BFFC8}.Debug|Any CPU.Build.0 = Debug|Any CPU 74 | {C2EB6F80-AEBE-46E4-9F7A-4768C58BFFC8}.Release|Any CPU.ActiveCfg = Release|Any CPU 75 | {C2EB6F80-AEBE-46E4-9F7A-4768C58BFFC8}.Release|Any CPU.Build.0 = Release|Any CPU 76 | {80EEDFAF-5360-42A8-AB56-8DF504AD9C45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 77 | {80EEDFAF-5360-42A8-AB56-8DF504AD9C45}.Debug|Any CPU.Build.0 = Debug|Any CPU 78 | {80EEDFAF-5360-42A8-AB56-8DF504AD9C45}.Release|Any CPU.ActiveCfg = Release|Any CPU 79 | {80EEDFAF-5360-42A8-AB56-8DF504AD9C45}.Release|Any CPU.Build.0 = Release|Any CPU 80 | {426EB78E-6488-4D89-83A2-545CBDDDA3F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 81 | {426EB78E-6488-4D89-83A2-545CBDDDA3F8}.Debug|Any CPU.Build.0 = Debug|Any CPU 82 | {426EB78E-6488-4D89-83A2-545CBDDDA3F8}.Release|Any CPU.ActiveCfg = Release|Any CPU 83 | {426EB78E-6488-4D89-83A2-545CBDDDA3F8}.Release|Any CPU.Build.0 = Release|Any CPU 84 | {5DF73C10-0BC4-4D9B-80FF-8CCFF35E7B58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 85 | {5DF73C10-0BC4-4D9B-80FF-8CCFF35E7B58}.Debug|Any CPU.Build.0 = Debug|Any CPU 86 | {5DF73C10-0BC4-4D9B-80FF-8CCFF35E7B58}.Release|Any CPU.ActiveCfg = Release|Any CPU 87 | {5DF73C10-0BC4-4D9B-80FF-8CCFF35E7B58}.Release|Any CPU.Build.0 = Release|Any CPU 88 | {0C752FFB-C212-41BD-9ACB-914B145FB135}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 89 | {0C752FFB-C212-41BD-9ACB-914B145FB135}.Debug|Any CPU.Build.0 = Debug|Any CPU 90 | {0C752FFB-C212-41BD-9ACB-914B145FB135}.Release|Any CPU.ActiveCfg = Release|Any CPU 91 | {0C752FFB-C212-41BD-9ACB-914B145FB135}.Release|Any CPU.Build.0 = Release|Any CPU 92 | {361CC010-0896-4AD5-961B-00D015D8C58C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 93 | {361CC010-0896-4AD5-961B-00D015D8C58C}.Debug|Any CPU.Build.0 = Debug|Any CPU 94 | {361CC010-0896-4AD5-961B-00D015D8C58C}.Release|Any CPU.ActiveCfg = Release|Any CPU 95 | {361CC010-0896-4AD5-961B-00D015D8C58C}.Release|Any CPU.Build.0 = Release|Any CPU 96 | {AC37CA9C-EC46-4164-A556-10A0ADF83558}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 97 | {AC37CA9C-EC46-4164-A556-10A0ADF83558}.Debug|Any CPU.Build.0 = Debug|Any CPU 98 | {AC37CA9C-EC46-4164-A556-10A0ADF83558}.Release|Any CPU.ActiveCfg = Release|Any CPU 99 | {AC37CA9C-EC46-4164-A556-10A0ADF83558}.Release|Any CPU.Build.0 = Release|Any CPU 100 | {BEEA8068-D3A9-4D5E-9EBC-E976EECB3456}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 101 | {BEEA8068-D3A9-4D5E-9EBC-E976EECB3456}.Debug|Any CPU.Build.0 = Debug|Any CPU 102 | {BEEA8068-D3A9-4D5E-9EBC-E976EECB3456}.Release|Any CPU.ActiveCfg = Release|Any CPU 103 | {BEEA8068-D3A9-4D5E-9EBC-E976EECB3456}.Release|Any CPU.Build.0 = Release|Any CPU 104 | {1647547B-F3A5-46B4-A856-CFC959B999A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 105 | {1647547B-F3A5-46B4-A856-CFC959B999A4}.Debug|Any CPU.Build.0 = Debug|Any CPU 106 | {1647547B-F3A5-46B4-A856-CFC959B999A4}.Release|Any CPU.ActiveCfg = Release|Any CPU 107 | {1647547B-F3A5-46B4-A856-CFC959B999A4}.Release|Any CPU.Build.0 = Release|Any CPU 108 | {81CC8290-EBE0-4F50-BAA1-EDD31F79723F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 109 | {81CC8290-EBE0-4F50-BAA1-EDD31F79723F}.Debug|Any CPU.Build.0 = Debug|Any CPU 110 | {81CC8290-EBE0-4F50-BAA1-EDD31F79723F}.Release|Any CPU.ActiveCfg = Release|Any CPU 111 | {81CC8290-EBE0-4F50-BAA1-EDD31F79723F}.Release|Any CPU.Build.0 = Release|Any CPU 112 | EndGlobalSection 113 | GlobalSection(SolutionProperties) = preSolution 114 | HideSolutionNode = FALSE 115 | EndGlobalSection 116 | GlobalSection(NestedProjects) = preSolution 117 | {817EF494-7C55-4073-9BC2-791873A5997B} = {FA809AD0-F6C9-4E21-91FA-A7D859721C0E} 118 | {E17020B3-FEFF-49D6-B391-F4E72E3C2743} = {FA809AD0-F6C9-4E21-91FA-A7D859721C0E} 119 | {F3851B0C-605B-4640-B38E-51E9FAEE284C} = {1EC08153-A99B-4661-AF45-7AA674AF0863} 120 | {1438236B-639F-49F2-AA47-8299671BD096} = {1EC08153-A99B-4661-AF45-7AA674AF0863} 121 | {24522BE7-54F7-4CB8-9FE0-1E58E6A170B9} = {FA809AD0-F6C9-4E21-91FA-A7D859721C0E} 122 | {F4427E96-6D6D-4AC0-89BA-12CB573B2D13} = {FA809AD0-F6C9-4E21-91FA-A7D859721C0E} 123 | {C2EB6F80-AEBE-46E4-9F7A-4768C58BFFC8} = {1EC08153-A99B-4661-AF45-7AA674AF0863} 124 | {80EEDFAF-5360-42A8-AB56-8DF504AD9C45} = {FA809AD0-F6C9-4E21-91FA-A7D859721C0E} 125 | {426EB78E-6488-4D89-83A2-545CBDDDA3F8} = {1EC08153-A99B-4661-AF45-7AA674AF0863} 126 | {5DF73C10-0BC4-4D9B-80FF-8CCFF35E7B58} = {1EC08153-A99B-4661-AF45-7AA674AF0863} 127 | {0C752FFB-C212-41BD-9ACB-914B145FB135} = {FA809AD0-F6C9-4E21-91FA-A7D859721C0E} 128 | {361CC010-0896-4AD5-961B-00D015D8C58C} = {1EC08153-A99B-4661-AF45-7AA674AF0863} 129 | {AC37CA9C-EC46-4164-A556-10A0ADF83558} = {FA809AD0-F6C9-4E21-91FA-A7D859721C0E} 130 | {BEEA8068-D3A9-4D5E-9EBC-E976EECB3456} = {FA809AD0-F6C9-4E21-91FA-A7D859721C0E} 131 | {1647547B-F3A5-46B4-A856-CFC959B999A4} = {1EC08153-A99B-4661-AF45-7AA674AF0863} 132 | {81CC8290-EBE0-4F50-BAA1-EDD31F79723F} = {FA809AD0-F6C9-4E21-91FA-A7D859721C0E} 133 | EndGlobalSection 134 | GlobalSection(ExtensibilityGlobals) = postSolution 135 | SolutionGuid = {6D15D992-48B3-40A4-A87A-59B51994B376} 136 | EndGlobalSection 137 | EndGlobal 138 | --------------------------------------------------------------------------------