防止.NET C#中的电子邮件重复请求

时间:2018-07-11 15:56:05

标签: c# asp.net multithreading

我有一个API Action处理POST请求。我需要做的是防止在第一个过程结束之前重复处理同一封电子邮件。我看到两种方法可以做到这一点:

  1. 进行SQL Transaction的检查,如果不存在,则插入并返回false或否则返回true。然后,当交易结束时,我们将从表中删除记录。我不喜欢它,因为如果说IIS将在进程表具有记录的过程中重新启动,并且我们需要找到处理它的方法。
  2. 制作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吗?在需要的地方使用吗?是否存在更有效的方法来防止重复事务而不锁定表或线程?

1 个答案:

答案 0 :(得分:0)

首先对我来说更好。由于每次IIS重新启动Web应用程序时,第二种方法中的字典将为空,并接受重复项。您在第一种方法中提到的问题实际上属于第二种方法。