c# - 防止 .NET C# 中的电子邮件重复请求
问题描述
我有一个API Action
处理POST
请求的。我需要做的是防止重复处理同一封电子邮件,直到第一个过程结束。我看到两种方法可以做到这一点:
- 进行
SQL Transaction
检查表,如果不存在则插入并返回false
或true
以其他方式。然后我们将在事务结束时从表中删除记录。我不喜欢它,因为如果,比如说,IIS 将在进程表中重新启动,就会有记录,我们需要想办法处理它。 - 使
ConcurrentDictionary
我们可以检查记录是否存在然后拒绝重复请求。我使用 C# 编写的代码ConcurrentDictionary<string, string>
:
if (!Singleton.TransactionEmails.TryAdd(email, email))
// decline
try
{
// transaction logic here
}
catch(Exception ex)
{
// catch logic here
}
finally
{
string pendingEmail = string.Empty;
Singleton.TransactionEmails.TryRemove(email, out pendingEmail);
}
我有几个问题。您看到使用第一种方式的任何优势吗?我的代码看起来不像线程安全的。我需要使用lock
吗?在哪里需要?是否存在更有效的方法来防止重复事务而不锁定表或线程?
解决方案
首先对我来说似乎更好。因为每次 IIS 重新启动您的 Web 应用程序时,您的第二种方法中的字典将为空并接受重复项。您在第一种方法中提到的问题实际上属于第二种方法。
推荐阅读
- python - sklearn MinMaxScaler - ValueError: Expected 2D array, got 1D array instead - data as series objects
- aws-lambda - 无服务器 lambda 的 cors 问题
- java - 错误: com.nguyenhoanglam.imagepicker.activity 包不存在
- python - Django model.Model.'instance' 引发 AttributeError
- performance - Open MPI的性能:独立节点是否有时间积累?
- php - 如何在某些字符后从字符串的开头和结尾删除?
- reactjs - 使用reactjs上传时如何取消图片
- android - 为android返回缓存位置的本地地理定位做出反应
- android - Flutter 应用中带有 Lottie 动画的原生 android 闪屏
- javascript - 相机实时流 - 识别拍摄的白色背景上的矩形或线条