Как получить правильный код ответа InsertAsync?

У меня есть CreateClassification API, который используется для вставки данных в таблицу базы данных. В таблице есть уникальное ограничение, поэтому, если я попытаюсь вставить ту же запись, она даст ответ ниже.

{
"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


person vivek nuna    schedule 04.09.2017    source источник


Ответы (2)


ABP скрывает сведения об исключениях от пользователей. Например, это сообщение об ошибке не рекомендуется показывать пользователям (из-за пользовательского опыта и безопасности вашего приложения):

Violation of UNIQUE KEY constraint 'IX_ClassificationCode'. Cannot insert duplicate key in object 'dbo.Classification'. The duplicate key value is (02).

Таким образом, вы должны самостоятельно обрабатывать определенные типы исключений (я не знаю тип исключения в вашем случае) и генерировать UserFriendlyException самостоятельно.

UserFriendlyException — это особый тип исключения, поэтому политика адресных книг напрямую показывает сообщение об исключении конечному пользователю.

ИЗМЕНИТЬ

Пример:

try
{
    await _repository.InsertAsync(...);
    await CurrentUnitOfWork.SaveChangesAsync();
}
catch(SqlDuplicateKeyException ex)
{
    throw new UserFriendlyException("Duplicate name..!");
}

Я не знаю, есть ли такое исключение SqlDuplicateKeyException. Чтобы понять его тип, поймайте общее исключение и проверьте его тип или сообщение. Это базовая практика C#.

person hikalkan    schedule 04.09.2017
comment
Но где мне нужно использовать UserFriendlyException в моем случае? - person vivek nuna; 05.09.2017
comment
Как мне узнать о типе исключения в коде, например о причине исключения, потому что только на основе этого типа я покажу пользователю UserFriendlyException. В приведенном выше случае я покажу повторяющиеся данные пользователя, попробуйте что-нибудь другое. - person vivek nuna; 05.09.2017
comment
Отредактировано. Добавил образец. - person hikalkan; 05.09.2017
comment
он даже не попал в точку останова в строке. поймать (Исключение ex) { - person vivek nuna; 05.09.2017
comment
В пример кода добавлено await CurrentUnitOfWork.SaveChangesAsync();. - person hikalkan; 05.09.2017

Вы можете использовать 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 !
            }
        }
    }
person Alper Ebicoglu    schedule 05.09.2017