这是我第一次发帖,很抱歉的问题格式,我不知道如何编辑它。
我的问题是,是否可以调用在不同类中生成的数据(在本例中为OTP的随机代码),在本例中是从OTP控制器类到电子邮件服务类?
我正在用ASP.NET Web API生成一个发送到电子邮件的OTP。到目前为止,我创建了一个单独的类/控制器来生成和保存OTP,然后是另一个类来设置电子邮件服务,最后是电子邮件控制器来发送电子邮件。
我生成一个随机代码作为OTP直接发送到数据库与后方法。
这是OTP控制器中的代码
[HttpPost]
public async Task<IActionResult> AddOTPs(Otp otp)
{
Random rand = new Random();
randomcode = (rand.Next(9999999)).ToString();
var otps = new Otp()
{
AlamatEmail = otp.AlamatEmail,
NamaKaryawan = otp.NamaKaryawan,
OTP_C = randomcode,
};
await _context.Otps.AddAsync(otps);
await _context.SaveChangesAsync();
return Ok(otps);
}
在另一个类中,我设置了电子邮件服务,以便在电子邮件控制器中调用。代码如下:
public void SendEmail(Otp request)
{
var email = new MimeMessage();
email.From.Add(MailboxAddress.Parse(_config.GetSection("EmailUsername").Value));
email.To.Add(MailboxAddress.Parse(request.AlamatEmail));
email.Subject = "OTP Test";
email.Body = new TextPart(TextFormat.Html) {
Text = request.OTP_C
};
using var smtp = new SmtpClient();
smtp.Connect(_config.GetSection("EmailHost").Value, 587, SecureSocketOptions.StartTls);
smtp.Authenticate(_config.GetSection("EmailUsername").Value, _config.GetSection("EmailPassword").Value);
smtp.Send(email);
smtp.Disconnect(true);
}
电子邮件控制器代码:
[HttpPost]
public IActionResult SendEmail(Otp request)
{
_emailService.SendEmail(request);
return Ok();
}
现在,所有这些代码都运行良好,没有任何错误,但是当我必须调用单独的API来将OTP发布到数据库,然后调用另一个API来发送电子邮件时,我必须手动输入电子邮件地址和OTP。所以现在的流程是这样的,将OTP发布到数据库API,从数据库API获取OTP,然后发布发送电子邮件API,总共需要3次API调用。
我的问题是:我如何确保OTP控制器中生成的随机码被发送到电子邮件服务类?或者我如何使它在OTP生成时被保存到数据库中,然后发送电子邮件。
基本上,我希望通过消除从数据库API获取OTP来确保只有1-2个API被调用,而不是3个。
先谢谢你了。
所有代码都是用C#为ASP.NET框架编写的
2条答案
按热度按时间unftdfkk1#
你不能这样做。如果你在控制器后面有一个外观类会更好。你可以调用外观类,这个类会将OTP保存到数据库中,然后用相同的OTP调用电子邮件服务。然后这个外观类可以从控制器调用。
}
mfuanj7w2#
这不是对你问题的回答,而是对你在评论中提出的问题的回应(关于加密强随机密码的一些示例代码)
代码如下:
结果将是一个十六进制字符串,其字符数是
entropyByteCount
参数值的16倍。这是因为传递给GetBytes
的数组中的字节数实际上应该可以被8整除,并且需要两个十六进制数字来呈现一个字节的内容。程式码预期您的程式中会有这个(
using System.Security.Cryptography;
)。有更好的方法将字节数组转换为十六进制字符串,看看:How do you convert a byte array to a hexadecimal string, and vice versa?