Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 三次向asp.net网站发送电子邮件_C#_Asp.net_Email_Iis_Web Config - Fatal编程技术网

C# 三次向asp.net网站发送电子邮件

C# 三次向asp.net网站发送电子邮件,c#,asp.net,email,iis,web-config,C#,Asp.net,Email,Iis,Web Config,我在一个电子商务网站上工作,我们正在努力解决一个问题。 客户完成订单后,她收到三封电子邮件(全部相同),而不是一封。 该网站在三台服务器上运行,我们认为这是问题所在,因为只使用一台服务器会向客户发送一封电子邮件。 我想知道我们应该怎么做,这样用户将只收到一封电子邮件,而不是三封,我们仍然会在三台服务器上运行该网站。 提前感谢,Laziale您不能指望数据库中的锁定提示来完成此操作。暗示只是暗示;无法保证锁定会按预期发生(假设这是SQL Server)。一般来说,关系数据库就是数据库。表不是一种排

我在一个电子商务网站上工作,我们正在努力解决一个问题。 客户完成订单后,她收到三封电子邮件(全部相同),而不是一封。 该网站在三台服务器上运行,我们认为这是问题所在,因为只使用一台服务器会向客户发送一封电子邮件。 我想知道我们应该怎么做,这样用户将只收到一封电子邮件,而不是三封,我们仍然会在三台服务器上运行该网站。
提前感谢,Laziale

您不能指望数据库中的锁定提示来完成此操作。暗示只是暗示;无法保证锁定会按预期发生(假设这是SQL Server)。一般来说,关系数据库就是数据库。表不是一种排队机制,如果您试图以这种方式使用它,您总是会遇到问题

尽管如此,为了实现不同的解决方案,我们必须确定是将单个记录添加到“队列”中,还是将添加三个记录。如果是第一次,只添加了一条记录,但发送了三封电子邮件,那么解决方案很简单。不要使用数据库表作为队列,而是使用Microsoft消息队列(MSMQ)。它们是Windows Server的一部分,至少从2003年开始,甚至可以追溯到2000年。他们将为您提供一个实际的队列,专门为您试图完成的任务而设计

如果有三条实际记录被添加到数据库中的“队列”表中,则表示存在代码问题。即使负载平衡器中有三台Web服务器,事实仍然是单次订单提交仅发生在其中一台服务器上。将电子邮件通知放入队列的业务逻辑不能来自多个服务器,因为请求仅来自一个服务器


我会先检查表,确定是否有多条记录被添加。如果没有,请将实现更改为使用MSMQ。如果是这样,请检查您的代码,以了解为什么在请求中添加了多条记录。

这是否是一个简单的并发问题,电子邮件周围的
锁(object){}
发送(与标志一起)就可以了?您是否正在使用
System.Net.Mail
?请您复制/粘贴发送电子邮件代码,以供USI使用。如果您正在使用三台服务器对您的站点进行负载平衡,他们仍需进行通信,以避免出现类似问题的情况。这听起来更像是一个设计问题,而不是代码问题。谁对电子邮件进行排队,以及如何发送电子邮件(从队列中消费)?这可能是两件事中的一件:3封电子邮件正在排队,或者同一队列中有三个消费者没有锁定。您是否只使用一个数据库?如果在读取时锁定行,请在发送完成时设置一个标志,然后释放该行。@Christoper感谢您的详细解释。我检查了表,只添加了一条记录。既然现在所有的数据都将首先进入表中,那么如何将实现更改为使用MSMQ呢。切换到MSMQ是否需要进行完整的代码更改?谢谢,合并MSMQ将是一个完整的代码更改。您的Web应用程序将使用.NET Framework固有的方法和类在队列上放置消息。然后,您需要创建一个监视队列的Windows服务。当消息到达队列头时,服务将自动“处理”它。根据队列中的消息量,您可以让主线程将消息传递给多个工作线程,或者只处理一个线程。无论哪种方式,它都将解决您的问题,并将实际执行和扩展得非常好。