Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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# 如何发送电子邮件并回滚更改?_C#_.net - Fatal编程技术网

C# 如何发送电子邮件并回滚更改?

C# 如何发送电子邮件并回滚更改?,c#,.net,C#,.net,我正在为asp.net MVC中的用户创建投诉登记表。投诉发送至用户电子邮件地址,并保存到SQL server 2017数据库中。我需要一个建议。 我的问题是,我如何处理电子邮件和数据库 条件1-如果数据库无法保存数据,但正在发送电子邮件,该怎么办。 条件2-如果数据库将数据保存到表中,但无法发送电子邮件,该怎么办 我是怎么做的 public void MyFunction() { try { var db = DbContext(); //some code

我正在为asp.net MVC中的用户创建投诉登记表。投诉发送至用户电子邮件地址,并保存到SQL server 2017数据库中。我需要一个建议。 我的问题是,我如何处理电子邮件和数据库

条件1-如果数据库无法保存数据,但正在发送电子邮件,该怎么办。
条件2-如果数据库将数据保存到表中,但无法发送电子邮件,该怎么办

我是怎么做的

public void MyFunction()
{
    try {
       var db = DbContext();
       //some code
       //The number of state entries written to database
       int entities = db.SaveChanges();
       if (entities > 0)
       {
          SendEmail();//what fails to send email and complaint is created. 
       }
    }
    catch(Exception ex)
    {
        //exception is handle
    }
}
db.SaveChanges()
完成时,它返回写入数据库的表数从我的作业来看,第二个条件是最重要的。

我想要的结果是,创建和发送电子邮件的过程都能顺利处理

我走的路对不对


感谢您的建议。

在这种情况下,我会将电子邮件保存到数据库中的一个表中,并实现一个服务,从该表读取并发送任何未发送的电子邮件,每个条目都有重试次数


这样,如果电子邮件失败,您可以随时尝试发送电子邮件。

在现实生活中,您将尝试处理另一个服务(如sendgrind)的电子邮件进程,因此您的应用程序将在保存完成后存储发送电子邮件的请求。您的服务将尽可能处理此请求;此外,您无需等待发送电子邮件来完成用户的请求

因为你正在做作业,你可以:

1-[建议]将该电子邮件存储在一个表中,并让一个小型服务从中读取,一旦找到记录,发送一封电子邮件并标记为
完成


2-[不要幻想]完全按照你现在做的去做。保存记录,如果<代码>成功/代码>发送电子邮件。

这是一个有趣的问题,因为它要求你考虑权衡、概率和完美与什么是足够好。< /P> 下面是足够好的:更新数据库。如果成功,将消息放入队列(可能是另一个数据库表),这将导致发送电子邮件

当数据库更新时,您可以直接通过SMTP发送电子邮件,但由于某些奇怪的暂时情况,电子邮件很可能无法发送。(这种情况会发生-可能SMTP权限被弄乱,电子邮件被拒绝。)将其放入带有单独进程的队列是确保电子邮件具有一定弹性的合理方法

为什么只有“足够好”呢?因为没有什么是防弹的。您的电子邮件仍有可能无法发送。毕竟,我们担心数据库更新可能会失败。但是,如果我们通过将记录插入其他进程监视的另一个数据库来发送电子邮件,这不意味着也可能失败吗?如果第一次数据库更新成功,但发送电子邮件的数据库更新失败,我们该怎么办

这就是我们开始权衡的地方。我们可能会将投诉插入数据库,但不发送电子邮件。这种情况发生的可能性有多大?如果发生,情况有多糟?无论我们可能会考虑如何应对这种不太可能的情况,难道这也不会失败吗?p> 那是一个兔子洞。我们可以无休止地让代码变得越来越复杂,试图解释越来越不可能出现的场景,但这不值得。最终,我们过于复杂的代码中的bug将成为某些东西无法工作的原因

与其追根究底,不如意识到有时我们的代码会因为我们无法控制的事情而失败,并知道失败会是什么样子。同样,这是一个什么足够好的问题

  • 初始数据库更新失败。用户看到一条消息,表示他们的投诉未保存。也许我们可以为他们提供另一种联系方式。将记录异常,以便我们能够找出发生了什么
  • 初始数据库更新成功,然后我们将电子邮件发送到队列。电子邮件处理失败。这也应该被记录下来。这可能更为紧迫,因为如果一封电子邮件失败,可能很多都会失败。希望该过程在出现故障时提供某种警报,以便有人能够解决问题
  • 初始数据库更新失败,尝试将电子邮件发送到队列失败。我们把它记录下来。再一次,希望有什么东西能让我们知道什么东西失败了,即使是有人收到的电子邮件摘要

即使这样也可能失败。我们的日志记录和警报可能会失败。我们可以用更具弹性的东西来代替它们,比如更好的消息队列。但当一切都不可能的时候,我们试图解释一切会让自己发疯。我们所能做的就是努力使我们的应用程序可靠且具有弹性

谢谢你的快速回复。我可以使用类似于或的事务来代替创建服务吗