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

 更新时间:2025年06月06日 09:13:04   作者:Microi风闲  
在当今的互联网应用中,短信验证码、通知等功能已成为必不可少的部分,本文将详细介绍如何在.NET 8应用中集成阿里云短信服务,实现短信发送功能,需要的可以参考一下

前言

在当今的互联网应用中,短信验证码、通知等功能已成为必不可少的部分。阿里云短信服务(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
{
    Task<bool> SendVerificationCodeAsync(string phoneNumber, string code);
}

3.2 实现短信服务

public class AliyunSmsService : ISmsService
{
    private readonly AliyunSmsSettings _settings;
    private readonly ILogger<AliyunSmsService> _logger;

    public AliyunSmsService(IOptions<AliyunSmsSettings> settings, ILogger<AliyunSmsService> logger)
    {
        _settings = settings.Value;
        _logger = logger;
    }

    public async Task<bool> 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.Configure<AliyunSmsSettings>(builder.Configuration.GetSection("AliyunSms"));
builder.Services.AddTransient<ISmsService, AliyunSmsService>();

四、创建控制器

[ApiController]
[Route("api/[controller]")]
public class SmsController : ControllerBase
{
    private readonly ISmsService _smsService;
    private readonly ILogger<SmsController> _logger;

    public SmsController(ISmsService smsService, ILogger<SmsController> logger)
    {
        _smsService = smsService;
        _logger = logger;
    }

    [HttpPost("send-verification-code")]
    public async Task<IActionResult> 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 Mock<ISmsService>();
    mockSmsService.Setup(x => x.SendVerificationCodeAsync(It.IsAny<string>(), It.IsAny<string>()))
                 .ReturnsAsync(true);
    
    var controller = new SmsController(mockSmsService.Object, Mock.Of<ILogger<SmsController>>());
    var request = new SendVerificationCodeRequest { PhoneNumber = "13800138000" };
    
    // Act
    var result = await controller.SendVerificationCode(request);
    
    // Assert
    var okResult = Assert.IsType<OkObjectResult>(result);
    var response = Assert.IsType<dynamic>(okResult.Value);
    Assert.True(response.Success);
}

5.2 性能优化建议

使用 HttpClient 池化技术

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

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

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

六、安全注意事项

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

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

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

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

敏感操作日志记录

七、总结

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

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

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

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

相关文章

  • asp.net xml序列化与反序列化

    asp.net xml序列化与反序列化

    在.NET下有一种技术叫做对象序列化,它可以将对象序列化为二进制文件、XML文件、SOAP文件,这样, 使用经过序列化的流进行传输效率就得到了大大的提升。
    2008-08-08
  • Asp.net 连接MySQL的实现代码[]

    Asp.net 连接MySQL的实现代码[]

    ASP.NET连接MySQL需要一个组件(.net本身不提供访问MySQL的驱动)MySQL.Data.Dll,此为官方提供(纯C#开发,开源噢),有多个版本选择,采用的数据访问模式为ADO.NET,跟asp.net访问sqlserver很像,非常简单。
    2009-08-08
  • asp.net Google的translate工具翻译 API

    asp.net Google的translate工具翻译 API

    很久前的一天,我想使用这个东西,然后看了下,GooGle的Translate工具目前没有公开API,还是一个逐渐完善的过程,另一方面,利用一段很小的程序就可以得到我们想要的效果。
    2008-12-12
  • 收集学习asp.net比较完整的面向对象开发流程

    收集学习asp.net比较完整的面向对象开发流程

    如果你已经有较多的面向对象开发经验,跳过以下这两步 第一步:掌握一门.NET面向对象语言第二步:对.NET Framework类库有一定的了解;在具备了OO基础之后,以下是具体的学习ASP.NET技术步骤
    2012-12-12
  • asp.net 导出到CSV文件乱码的问题

    asp.net 导出到CSV文件乱码的问题

    导出到CSV文件乱码的问题,需要的朋友可以参考下。
    2010-03-03
  • 在ashx文件中使用session的解决思路

    在ashx文件中使用session的解决思路

    如果你要保证数据的安全性,你可以在ashx中使用session验证如:你的index.aspx中使用jquery回调ashx数据,那么在index.aspx page_load时session[checked]="true",在ashx中验证session是否存在
    2013-01-01
  • asp.net实现md5加密

    asp.net实现md5加密

    MD5加密简单的说就是把一段明文 通过某种运算方式 求出密文。在ASP.NET中MD5的加密方式很简单,详细介绍看下文
    2014-03-03
  • Debian 8或Debian 9(64 位)安装 .NET Core

    Debian 8或Debian 9(64 位)安装 .NET Core

    这篇文章主要为大家详细介绍了Debian 8或Debian 9(64 位)安装 .NET Core,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • asp.net datalist绑定数据后可以上移下移实现示例

    asp.net datalist绑定数据后可以上移下移实现示例

    这篇文章主要介绍了asp.net datalist绑定数据后可以上移下移的示例代码,需要的朋友可以参考下
    2014-02-02
  • asp.net IList查询数据后格式化数据再绑定控件

    asp.net IList查询数据后格式化数据再绑定控件

    这篇文章送给.net初学者或者遇到类似问题的朋友,就是IList如何格式化数据再绑定,我看到网上没有多少朋友讲到这方面的最基本的问题,现在我简单说说吧,代码我就截取其中一些讲,如果不明白的朋友可以留言或者联系我。
    2009-11-11

最新评论