首页 > 解决方案 > 在这种情况下处理异常的最佳方法是什么

问题描述

我正在编写一个 C# WEB API,它采用多部分形式的数据在数据库中创建记录并将文件上传到某个位置。作为创建的一部分,我还将创建一个 Jira 问题并使用 JIRA 详细信息更新创建的记录。

  [Route("api/request/create")]
  [Consumes("multipart/form-data")]
  public async Task<HttpResponseMessage> CreateRequest()
  {
     try
     {
        var multipartMemoryStream = await Request.Content.ReadAsMultipartAsync();
        var newRequestData = await multipartMemoryStream.Contents[0].ReadAsStringAsync();

       CreateRequestCommand createRequestCommand = JsonConvert.DeserializeObject<CreateRequestCommand>(newRequestData);

       var requestId = CreateRequestInDB(createRequestCommand)
       var jira = await CreateJira(createContentRequestCommand);
       await WriteSourceFiles(multipartMemoryStream.Contents);
       await UpdateRequestWithJiraDetails(requestId, jira);
       return new SuccessResponse(requestId)
    }
   catch (Exception ex)
   {
      throw ex;
   }
}

在大多数情况下,这工作正常。如何以最佳方式处理异常,以便如果任何方法失败,系统不应保留 DB 中的记录并删除 JIRA 问题。如果任何步骤失败,将系统保持在一致状态的最佳策略是什么?

标签: c#asp.net-coreexceptiondesign-patternsjira-rest-api

解决方案


如果您有多个操作并且希望它们全部成功或全部失败,那么您需要一个称为Transaction.

在 .NET 中,这是在System.Transactions命名空间中实现的,类TransactionScope可能是您最终将使用的。

抱歉,这含糊不清且没有代码示例,但由于您只发布了自己的方法名称,因此您必须自己弄清楚在这些方法中实际执行的代码是做什么的,以及它与 Microsoft 类的配合程度如何。如果您的数据库是 Entity Framework 或 plain SqlConnection,它可能开箱即用。但这取决于你自己想办法。


推荐阅读