c# - 在这种情况下处理异常的最佳方法是什么
问题描述
我正在编写一个 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 问题。如果任何步骤失败,将系统保持在一致状态的最佳策略是什么?
解决方案
如果您有多个操作并且希望它们全部成功或全部失败,那么您需要一个称为Transaction
.
在 .NET 中,这是在System.Transactions
命名空间中实现的,类TransactionScope
可能是您最终将使用的。
抱歉,这含糊不清且没有代码示例,但由于您只发布了自己的方法名称,因此您必须自己弄清楚在这些方法中实际执行的代码是做什么的,以及它与 Microsoft 类的配合程度如何。如果您的数据库是 Entity Framework 或 plain SqlConnection
,它可能开箱即用。但这取决于你自己想办法。
推荐阅读
- c++ - 如何在忽略 C++ 中的噪声词的同时解析用户输入?
- swift - 使intrinsicContentSize适应外部约束
- javascript - clearRect 左侧和顶部不清除
- nginx - Godaddy DNS 到 AWS EC2
- android - PHONEGAP ANDROID:仅在应用程序主屏幕 (SplashScreen) 上隐藏状态栏
- excel - 为什么我的具有相对引用的 VBA 返回不正确的引用?
- php - 无法让服务器捕获授权标头 WP Rest API
- javascript - ANTLR4 JavaScript 解析器:如何在解析中捕获错误
- javascript - 如何在不改变任何内容的情况下找到数组中最常出现的项目?
- python - pyspark 根据列值删除重复行