├── 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 | [](https://abp.io)
4 | [](https://www.nuget.org/packages/EasyAbp.Abp.TencentCloud.Common)
5 | [](https://www.nuget.org/packages/EasyAbp.Abp.TencentCloud.Common)
6 | [](https://discord.gg/xyg8TrRa27)
7 | [](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 |
--------------------------------------------------------------------------------