如何获取 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 !
            }
        }
    }