.NET8集成阿里云短信服务实现短信发送功能

ASP.NET教程 2025-08-24

目录

  • 前言
  • 一、准备工作
    • 1.1 阿里云账号准备
    • 1.2 .NET 8项目创建
  • 二、集成阿里云短信SDK
    • 2.1 安装NuGet包
    • 2.2 配置阿里云短信参数
    • 2.3 创建配置类
  • 三、实现短信发送服务
    • 3.1 创建短信服务接口
    • 3.2 实现短信服务
    • 3.3 注册服务
  • 四、创建控制器
    • 五、测试与优化
      • 5.1 单元测试
      • 5.2 性能优化建议
    • 六、安全注意事项
      • 七、总结

        前言

        在当今的互联网应用中,短信验证码、通知等功能已成为必不可少的部分。阿里云短信服务(SMS)作为国内领先的短信平台,提供了稳定可靠的短信发送能力。本文将详细介绍如何在.NET 8应用中集成阿里云短信服务,实现短信发送功能。

        一、准备工作

        1.1 阿里云账号准备

        注册阿里云账号并完成实名认证

        开通短信服务(SMS)

        申请短信签名和模板(需企业资质)

        获取 AccessKey ID 和 AccessKey Secret

        1.2 .NET 8项目创建

        dotnet new webapi -n AliyunSmsDemo
        cd AliyunSmsDemo
        

        二、集成阿里云短信SDK

        2.1 安装NuGet包

        dotnet add package Aliyun.SDK.Core
        dotnet add package Aliyun.SDK.Dysmsapi
        

        2.2 配置阿里云短信参数

        在 appsettings.json 中添加配置:

        {
          "AliyunSms": {
            "AccessKeyId": "your-access-key-id",
            "AccessKeySecret": "your-access-key-secret",
            "Endpoint": "dysmsapi.aliyuncs.com",
            "SignName": "your-sign-name",
            "TemplateCode": "your-template-code"
          }
        }
        

        2.3 创建配置类

        public class AliyunSmsSettings
        {
            public string AccessKeyId { get; set; }
            public string AccessKeySecret { get; set; }
            public string Endpoint { get; set; }
            public string SignName { get; set; }
            public string TemplateCode { get; set; }
        }
        

        三、实现短信发送服务

        3.1 创建短信服务接口

        public interface ISmsService
        {
            Taskbool SendVerificationCodeAsync(string phoneNumber, string code);
        }
        

        3.2 实现短信服务

        public class AliyunSmsService : ISmsService
        {
            private readonly AliyunSmsSettings _settings;
            private readonly ILoggerAliyunSmsService _logger;
        
            public AliyunSmsService(IOptionsAliyunSmsSettings settings, ILoggerAliyunSmsService logger)
            {
                _settings = settings.Value;
                _logger = logger;
            }
        
            public async Taskbool SendVerificationCodeAsync(string phoneNumber, string code)
            {
                try
                {
                    var client = CreateClient();
                    var request = new SendSmsRequest
                    {
                        PhoneNumbers = phoneNumber,
                        SignName = _settings.SignName,
                        TemplateCode = _settings.TemplateCode,
                        TemplateParam = $"{{"code":"[code]"}}"
                    };
        
                    var response = await client.SendSmsAsync(request);
                    
                    _logger.LogInformation($"短信发送结果: {JsonSerializer.Serialize(response)}");
                    
                    return response.Body.Code == "OK";
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "发送短信时发生异常");
                    return false;
                }
            }
        
            private DysmsapiClient CreateClient()
            {
                var config = new Config
                {
                    AccessKeyId = _settings.AccessKeyId,
                    AccessKeySecret = _settings.AccessKeySecret,
                    Endpoint = _settings.Endpoint
                };
                
                return new DysmsapiClient(config);
            }
        }
        

        3.3 注册服务

        在 Program.cs 中添加:

        builder.Services.ConfigureAliyunSmsSettings(builder.Configuration.GetSection("AliyunSms"));
        builder.Services.AddTransientISmsService, AliyunSmsService();
        

        四、创建控制器

        [ApiController]
        [Route("api/[controller]")]
        public class SmsController : ControllerBase
        {
            private readonly ISmsService _smsService;
            private readonly ILoggerSmsController _logger;
        
            public SmsController(ISmsService smsService, ILoggerSmsController logger)
            {
                _smsService = smsService;
                _logger = logger;
            }
        
            [HttpPost("send-verification-code")]
            public async TaskIActionResult SendVerificationCode([FromBody] SendVerificationCodeRequest request)
            {
                // 生成随机验证码(实际项目中可能需要更复杂的生成逻辑)
                var code = new Random().Next(100000, 999999).ToString();
                
                // 发送短信
                var result = await _smsService.SendVerificationCodeAsync(request.PhoneNumber, code);
                
                if (result)
                {
                    // 实际项目中应该将验证码存储到数据库或缓存中,并设置过期时间
                    _logger.LogInformation($"验证码发送成功: [code]");
                    return Ok(new { Success = true, Message = "验证码发送成功" });
                }
                
                return BadRequest(new { Success = false, Message = "验证码发送失败" });
            }
        }
        
        public class SendVerificationCodeRequest
        {
            [Required]
            [Phone]
            public string PhoneNumber { get; set; }
        }
        

        五、测试与优化

        5.1 单元测试

        [Fact]
        public async Task SendVerificationCode_ShouldReturnSuccess_WhenSmsSent()
        {
            // Arrange
            var mockSmsService = new MockISmsService();
            mockSmsService.Setup(x = x.SendVerificationCodeAsync(It.IsAnystring(), It.IsAnystring()))
                         .ReturnsAsync(true);
            
            var controller = new SmsController(mockSmsService.Object, Mock.OfILoggerSmsController());
            var request = new SendVerificationCodeRequest { PhoneNumber = "13800138000" };
            
            // Act
            var result = await controller.SendVerificationCode(request);
            
            // Assert
            var okResult = Assert.IsTypeOkObjectResult(result);
            var response = Assert.IsTypedynamic(okResult.Value);
            Assert.True(response.Success);
        }
        

        5.2 性能优化建议

        使用 HttpClient 池化技术

        实现短信发送限流,防止短时间内发送过多短信

        使用缓存存储验证码,避免重复生成

        实现异步发送队列,提高系统响应速度

        六、安全注意事项

        不要将 AccessKey硬编码在代码中,使用安全的方式存储

        实现短信发送频率限制,防止短信轰炸

        验证码应该有有效期(通常5-10分钟)

        对手机号进行格式验证和黑名单检查

        敏感操作日志记录

        七、总结

        本文详细介绍了在.NET 8应用中集成阿里云短信服务的完整流程,包括:

        • 阿里云短信服务的申请和配置
        • .NET项目中SDK的集成
        • 短信服务的封装实现
        • 控制器的创建和测试
        • 性能优化和安全注意事项

        通过本文的指导,开发者可以快速在自己的.NET 8应用中实现短信发送功能,为应用增加短信验证、通知等能力。

        到此这篇关于.NET8集成阿里云短信服务实现短信发送功能的文章就介绍到这了,更多相关.NET8集成阿里云短信服务内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

        您可能感兴趣的文章:
        • .net core 使用阿里云分布式日志的配置方法
        • 在阿里云函数计算上部署.NET Core 3.1的方法
        • 阿里云上从ASP.NET线程角度对“黑色30秒”问题的全新分析
        • .Net使用RabbitMQ实现短信密码重置的操作步骤
        • ASP.NET MVC阿里大于短信接口开发短信群发能
        • ASP.NET(VB)写的后台发送短信实现代码