如何获取 InsertAsync 的正确响应代码?
How to get the proper response code of InsertAsync?
我有一个 CreateClassification
API 用于将数据插入数据库 table。 table 中存在唯一约束,因此如果我尝试插入相同的记录,它会给出以下响应。
{
"result": null,
"targetUrl": null,
"success": false,
"error": {
"code": 0,
"message": "An internal error occurred during your request!",
"details": null,
"validationErrors": null
},
"unAuthorizedRequest": false,
"__abp": true
}
API:
await _classificationrepository.InsertAsync(classobj);
但是这个响应消息并不清楚失败原因,因为插入失败的原因可能有很多,所以有什么办法可以得到正确的失败原因。
Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'IX_ClassificationCode'. Cannot insert duplicate key in object 'dbo.Classification'. The duplicate key value is (02).
The statement has been terminated.
按照提示,我已经试过了,但是对api响应没有影响:
Task Createxyz(XyzInput input);
public async Task Createxyz(XyzInput input)
{
try
{
await _xyzrepository.InsertAsync(classobj);
}
catch (Exception)
{
throw new UserFriendlyException("hello");
}
}
点击下方 url:
http://localhost:22742/api/services/app/xyz/Createxyz
我还有一个疑惑,我的Createxyz
是怎么转换成api的?意思是abp是怎么提供路由到Createxyz
方法的,这样终端用户就可以调用这个api
ABP 向用户隐藏异常详细信息。例如,这不是向用户显示的好错误消息(因为用户体验和应用程序的安全性):
Violation of UNIQUE KEY constraint 'IX_ClassificationCode'. Cannot insert duplicate key in object 'dbo.Classification'. The duplicate key value is (02).
所以,你应该自己处理特定类型的异常(我不知道你的异常类型)并自己抛出 UserFriendlyException
。
UserFriendlyException
是一种特定类型的异常,因此 ABP 直接向最终用户显示异常消息。
编辑
示例:
try
{
await _repository.InsertAsync(...);
await CurrentUnitOfWork.SaveChangesAsync();
}
catch(SqlDuplicateKeyException ex)
{
throw new UserFriendlyException("Duplicate name..!");
}
不知道有没有这样的SqlDuplicateKeyException。要了解它的类型,请捕获一般异常并检查它的类型或消息。这是基本的 C# 实践。
您可以使用 IUnitOfWorkManager 。
查看下面的代码;
public class MySampleAppService : ApplicationService
{
private readonly IUnitOfWorkManager _unitOfWorkManager;
public MySampleAppService(IUnitOfWorkManager unitOfWorkManager)
{
_unitOfWorkManager = unitOfWorkManager;
}
public async Task Createxyz(XyzInput input)
{
try
{
using (var unitOfWork = _unitOfWorkManager.Begin())
{
await _xyzrepository.InsertAsync(classobj);
unitOfWork.Complete();
}
}
catch (Exception ex)
{
throw new UserFriendlyException("hello this is the exception message: " + ex.Message);
//note: check if there's inner exceptions you need to flatten all the inner exceptions !
}
}
}
我有一个 CreateClassification
API 用于将数据插入数据库 table。 table 中存在唯一约束,因此如果我尝试插入相同的记录,它会给出以下响应。
{
"result": null,
"targetUrl": null,
"success": false,
"error": {
"code": 0,
"message": "An internal error occurred during your request!",
"details": null,
"validationErrors": null
},
"unAuthorizedRequest": false,
"__abp": true
}
API:
await _classificationrepository.InsertAsync(classobj);
但是这个响应消息并不清楚失败原因,因为插入失败的原因可能有很多,所以有什么办法可以得到正确的失败原因。
Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'IX_ClassificationCode'. Cannot insert duplicate key in object 'dbo.Classification'. The duplicate key value is (02).
The statement has been terminated.
按照提示,我已经试过了,但是对api响应没有影响:
Task Createxyz(XyzInput input);
public async Task Createxyz(XyzInput input)
{
try
{
await _xyzrepository.InsertAsync(classobj);
}
catch (Exception)
{
throw new UserFriendlyException("hello");
}
}
点击下方 url:
http://localhost:22742/api/services/app/xyz/Createxyz
我还有一个疑惑,我的Createxyz
是怎么转换成api的?意思是abp是怎么提供路由到Createxyz
方法的,这样终端用户就可以调用这个api
ABP 向用户隐藏异常详细信息。例如,这不是向用户显示的好错误消息(因为用户体验和应用程序的安全性):
Violation of UNIQUE KEY constraint 'IX_ClassificationCode'. Cannot insert duplicate key in object 'dbo.Classification'. The duplicate key value is (02).
所以,你应该自己处理特定类型的异常(我不知道你的异常类型)并自己抛出 UserFriendlyException
。
UserFriendlyException
是一种特定类型的异常,因此 ABP 直接向最终用户显示异常消息。
编辑
示例:
try
{
await _repository.InsertAsync(...);
await CurrentUnitOfWork.SaveChangesAsync();
}
catch(SqlDuplicateKeyException ex)
{
throw new UserFriendlyException("Duplicate name..!");
}
不知道有没有这样的SqlDuplicateKeyException。要了解它的类型,请捕获一般异常并检查它的类型或消息。这是基本的 C# 实践。
您可以使用 IUnitOfWorkManager 。 查看下面的代码;
public class MySampleAppService : ApplicationService
{
private readonly IUnitOfWorkManager _unitOfWorkManager;
public MySampleAppService(IUnitOfWorkManager unitOfWorkManager)
{
_unitOfWorkManager = unitOfWorkManager;
}
public async Task Createxyz(XyzInput input)
{
try
{
using (var unitOfWork = _unitOfWorkManager.Begin())
{
await _xyzrepository.InsertAsync(classobj);
unitOfWork.Complete();
}
}
catch (Exception ex)
{
throw new UserFriendlyException("hello this is the exception message: " + ex.Message);
//note: check if there's inner exceptions you need to flatten all the inner exceptions !
}
}
}