翼度科技»论坛 编程开发 .net 查看内容

第18篇 .net使用RabbitMQ实现短信密码重置

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
在 C# 中使用 RabbitMQ 通过短信发送重置后的密码到用户的手机号上,你可以按照以下步骤进行

1.安装 RabbitMQ 客户端库

首先,确保你已经安装了 RabbitMQ 客户端库。你可以通过 NuGet 包管理器来安装:
  1. dotnet add package RabbitMQ.Client
复制代码
2.创建 RabbitMQ 连接和通道

创建一个 RabbitMQ 连接和通道,用于发送消息。
  1. using RabbitMQ.Client;
  2. using System;
  3. using System.Text;
  4. public class RabbitMQHelper
  5. {
  6.     private readonly string _hostName;
  7.     private readonly string _userName;
  8.     private readonly string _password;
  9.     private readonly string _queueName;
  10. public RabbitMQHelper(string hostName, string userName, string password, string queueName)
  11. {
  12.     _hostName = hostName;
  13.     _userName = userName;
  14.     _password = password;
  15.     _queueName = queueName;
  16. }
  17. public void SendMessage(string message)
  18. {
  19.     var factory = new ConnectionFactory()
  20.     {
  21.         HostName = _hostName,
  22.         UserName = _userName,
  23.         Password = _password
  24.     };
  25.     using (var connection = factory.CreateConnection())
  26.     using (var channel = connection.CreateModel())
  27.     {
  28.         channel.QueueDeclare(queue: _queueName,
  29.                              durable: false,
  30.                              exclusive: false,
  31.                              autoDelete: false,
  32.                              arguments: null);
  33.         var body = Encoding.UTF8.GetBytes(message);
  34.         channel.BasicPublish(exchange: "",
  35.                              routingKey: _queueName,
  36.                              basicProperties: null,
  37.                              body: body);
  38.         Console.WriteLine($" [x] Sent {message}");
  39.     }
  40. }
  41. }
复制代码
3.创建短信发送服务

创建一个短信发送服务,用于处理从 RabbitMQ 接收到的消息并发送短信。
  1. public class SmsService
  2. {
  3.     public void SendSms(string phoneNumber, string message)
  4.     {
  5.         // 在这里实现短信发送逻辑
  6.         Console.WriteLine($"Sending SMS to {phoneNumber}: {message}");
  7.     }
  8. }
复制代码
4.创建 RabbitMQ 消费者

创建一个 RabbitMQ 消费者,用于从队列中接收消息并调用短信发送服务。
  1. using RabbitMQ.Client;
  2. using RabbitMQ.Client.Events;
  3. using System;
  4. using System.Text;
  5. public class RabbitMQConsumer
  6. {
  7. private readonly string _hostName;
  8. private readonly string _userName;
  9. private readonly string _password;
  10. private readonly string _queueName;
  11. private readonly SmsService _smsService;
  12. public RabbitMQConsumer(string hostName, string userName, string password, string queueName, SmsService smsService)
  13. {
  14.     _hostName = hostName;
  15.     _userName = userName;
  16.     _password = password;
  17.     _queueName = queueName;
  18.     _smsService = smsService;
  19. }
  20. public void StartConsuming()
  21. {
  22.     var factory = new ConnectionFactory()
  23.     {
  24.         HostName = _hostName,
  25.         UserName = _userName,
  26.         Password = _password
  27.     };
  28.     using (var connection = factory.CreateConnection())
  29.     using (var channel = connection.CreateModel())
  30.     {
  31.         channel.QueueDeclare(queue: _queueName,
  32.                              durable: false,
  33.                              exclusive: false,
  34.                              autoDelete: false,
  35.                              arguments: null);
  36.         var consumer = new EventingBasicConsumer(channel);
  37.         consumer.Received += (model, ea) =>
  38.         {
  39.             var body = ea.Body.ToArray();
  40.             var message = Encoding.UTF8.GetString(body);
  41.             var phoneNumber = "user_phone_number"; // 从消息中解析出手机号
  42.             _smsService.SendSms(phoneNumber, message);
  43.         };
  44.         channel.BasicConsume(queue: _queueName,
  45.                              autoAck: true,
  46.                              consumer: consumer);
  47.         Console.WriteLine(" Press [enter] to exit.");
  48.         Console.ReadLine();
  49.     }
  50. }
  51. }
复制代码
5.集成到用户密码重置流程

在你的用户密码重置流程中,生成新的密码并将其发送到 RabbitMQ 队列。
  1. public class UserService
  2. {
  3. private readonly RabbitMQHelper _rabbitMQHelper;
  4. public UserService(RabbitMQHelper rabbitMQHelper)
  5. {
  6.     _rabbitMQHelper = rabbitMQHelper;
  7. }
  8. public void ResetPassword(Guid userId)
  9. {
  10.     // 生成新的密码
  11.     string newPassword = GeneratePassword();
  12.     // 将新密码发送到 RabbitMQ 队列
  13.     string message = $"Your new password is: {newPassword}";
  14.     _rabbitMQHelper.SendMessage(message);
  15.     // 其他逻辑,例如更新数据库中的密码
  16. }
  17. private string GeneratePassword()
  18. {
  19.     // 生成随机密码的逻辑
  20.     return "random_password";
  21. }
  22. }
复制代码
6.启动 RabbitMQ 消费者

在应用程序启动时,启动 RabbitMQ 消费者以处理消息。
  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5.     string hostName = "localhost";
  6.     string userName = "guest";
  7.     string password = "guest";
  8.     string queueName = "sms_queue";
  9.     var smsService = new SmsService();
  10.     var rabbitMQConsumer = new RabbitMQConsumer(hostName, userName, password, queueName, smsService);
  11.     // 启动消费者
  12.     rabbitMQConsumer.StartConsuming();
  13. }
  14. }
复制代码
7.配置 RabbitMQ 连接信息

确保你的 RabbitMQ 连接信息(主机名、用户名、密码、队列名)是正确的,并且 RabbitMQ 服务器正在运行。
示例代码
以下是一个完整的示例代码,展示如何使用 RabbitMQ 通过短信发送重置后的密码到用户的手机号上:
  1. using RabbitMQ.Client;using RabbitMQ.Client.Events;using System;using System.Text;public class RabbitMQHelper{private readonly string _hostName;private readonly string _userName;private readonly string _password;private readonly string _queueName;public RabbitMQHelper(string hostName, string userName, string password, string queueName){    _hostName = hostName;    _userName = userName;    _password = password;    _queueName = queueName;}public void SendMessage(string message){    var factory = new ConnectionFactory()    {        HostName = _hostName,        UserName = _userName,        Password = _password    };    using (var connection = factory.CreateConnection())    using (var channel = connection.CreateModel())    {        channel.QueueDeclare(queue: _queueName,                             durable: false,                             exclusive: false,                             autoDelete: false,                             arguments: null);        var body = Encoding.UTF8.GetBytes(message);        channel.BasicPublish(exchange: "",                             routingKey: _queueName,                             basicProperties: null,                             body: body);        Console.WriteLine($" [x] Sent {message}");    }}}public class SmsService{public void SendSms(string phoneNumber, string message){    // 在这里实现短信发送逻辑    Console.WriteLine($"Sending SMS to {phoneNumber}: {message}");}}public class RabbitMQConsumer{private readonly string _hostName;private readonly string _userName;private readonly string _password;private readonly string _queueName;private readonly SmsService _smsService;public RabbitMQConsumer(string hostName, string userName, string password, string queueName, SmsService smsService){    _hostName = hostName;    _userName = userName;    _password = password;    _queueName = queueName;    _smsService = smsService;}public void StartConsuming(){    var factory = new ConnectionFactory()    {        HostName = _hostName,        UserName = _userName,        Password = _password    };    using (var connection = factory.CreateConnection())    using (var channel = connection.CreateModel())    {        channel.QueueDeclare(queue: _queueName,                             durable: false,                             exclusive: false,                             autoDelete: false,                             arguments: null);        var consumer = new EventingBasicConsumer(channel);        consumer.Received += (model, ea) =>        {            var body = ea.Body.ToArray();            var message = Encoding.UTF8.GetString(body);            var phoneNumber = "user_phone_number"; // 从消息中解析出手机号            _smsService.SendSms(phoneNumber, message);        };        channel.BasicConsume(queue: _queueName,                             autoAck: true,                             consumer: consumer);        Console.WriteLine(" Press [enter] to exit.");        Console.ReadLine();    }}}public class UserService
  2. {
  3. private readonly RabbitMQHelper _rabbitMQHelper;
  4. public UserService(RabbitMQHelper rabbitMQHelper)
  5. {
  6.     _rabbitMQHelper = rabbitMQHelper;
  7. }
  8. public void ResetPassword(Guid userId)
  9. {
  10.     // 生成新的密码
  11.     string newPassword = GeneratePassword();
  12.     // 将新密码发送到 RabbitMQ 队列
  13.     string message = $"Your new password is: {newPassword}";
  14.     _rabbitMQHelper.SendMessage(message);
  15.     // 其他逻辑,例如更新数据库中的密码
  16. }
  17. private string GeneratePassword()
  18. {
  19.     // 生成随机密码的逻辑
  20.     return "random_password";
  21. }
  22. }public class Program
  23. {
  24. public static void Main(string[] args)
  25. {
  26.     string hostName = "localhost";
  27.     string userName = "guest";
  28.     string password = "guest";
  29.     string queueName = "sms_queue";
  30.     var smsService = new SmsService();
  31.     var rabbitMQConsumer = new RabbitMQConsumer(hostName, userName, password, queueName, smsService);
  32.     // 启动消费者
  33.     rabbitMQConsumer.StartConsuming();
  34. }
  35. }
复制代码
来源:https://www.cnblogs.com/chenshibao/p/18402707
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具