【发布时间】:2020-07-17 18:06:17
【问题描述】:
我正在编写一个 C# WEB API,它采用多部分形式的数据在 DB 中创建记录并将文件上传到某个位置。作为创建的一部分,我还将创建一个 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 问题。 如果任何步骤失败,使系统保持一致状态的最佳策略是什么。
【问题讨论】:
-
欢迎来到 StackOverflow。不幸的是,这是一个非常复杂的话题。您已进入分布式事务领域。没有万能的解决方案,但我建议检查Sagas pattern。
-
@PeterCsala 你为什么不写一个答案而不是评论所有现有的帖子?
标签: c# asp.net-core exception design-patterns jira-rest-api