Как настроить реагирование на ошибки в веб-API с ядром .net? - PullRequest
0 голосов
/ 01 марта 2019

Я использую .net core 2.2 с веб-API.Я создал один класс, т.е. как показано ниже:

public class NotificationRequestModel
{
    [Required]
    public string DeviceId { get; set; }
    [Required]
    public string FirebaseToken { get; set; }
    [Required]
    public string OS { get; set; }

    public int StoreId { get; set; }
}

Используя вышеупомянутый класс, я создал один метод.Теперь я хочу вернуть пользовательский объект, но он возвращает свой собственный объект.Метод API:

public ActionResult<bool> UpdateFirebaseToken(NotificationRequestModel model)
   {
       if (!ModelState.IsValid)
       {
          return BadRequest(FormatOutput(ModelState.Values));
       }
       var result = _notificationService.InsertOrUpdateFirebaseToken(model);
       return Ok(result);
   }

Здесь FormatOutput метод форматирует вывод.

protected Base FormatOutput(object input, int code = 0, string message = "", string[] details = null)
    {
        Base baseResult = new Base();
        baseResult.Status = code;
        baseResult.Error = message;
        baseResult.TimeStamp = CommonHelper.CurrentTimeStamp;
        baseResult.Code = code;
        baseResult.Details = details;
        baseResult.Message = message; //Enum.Parse<APIResponseMessageEnum>(code.ToString(), true); // (enum of code get value from language)
        return baseResult;
    }

Но проблема в том, что он возвращает:

{"ошибки ": {" DeviceId ": [" Поле DeviceId обязательно для заполнения. "]}, "title": "Произошла одна или несколько ошибок проверки.", "status": 400, "traceId": "80000049-0001-fc00-b63f-84710c7967bb"}

Я хочучтобы настроить эту ошибку с моей моделью.Мне нужно сообщение об ошибке и подробности из возвращенного вывода и передать его моей модели.Как я могу это сделать?Я попытался отладить свой код и обнаружил, что точка останова в методе API не вызывается.Поэтому я не могу справиться со своим собственным методом.Есть ли решение?Что я делаю неправильно?Любая помощь будет высоко ценится.Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Как проанализировал Крис, ваша проблема вызвана Автоматическими ответами HTTP 400 .

Для быстрого решения вы можете подавить эту функцию на

services.AddMvc()
        .ConfigureApiBehaviorOptions(options => {
            options.SuppressModelStateInvalidFilter = true;
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

Для эффективности вы можете последовать совету Криса, как показано ниже:

services.AddMvc()
        .ConfigureApiBehaviorOptions(options => {
            //options.SuppressModelStateInvalidFilter = true;
            options.InvalidModelStateResponseFactory = actionContext =>
            {
                var modelState = actionContext.ModelState.Values;
                return new BadRequestObjectResult(FormatOutput(modelState));
            };
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

И, нет необходимости определять код ниже в вашем действии.

if (!ModelState.IsValid)
    {
        return BadRequest(FormatOutput(ModelState.Values));
    }
0 голосов
/ 01 марта 2019

При использовании контроллера с примененным атрибутом ApiController ASP.NET Core автоматически обрабатывает ошибки проверки модели, возвращая неверный запрос 400 с ModelState в качестве тела ответа.Таким образом, ваше условное тестирование ModelState.IsValid по сути всегда ложно (и, следовательно, не введено), потому что единственные запросы, которые когда-либо достигнут этого, являются действительными.

Вы можете просто удалить атрибут ApiController, ноэто удаляет кучу других полезных вещей, которые добавляют атрибуты.Лучше всего использовать фабрику пользовательских ответов:

services.Configure<ApiBehaviorOptions>(o =>
{
    o.InvalidModelStateResponseFactory = actionContext =>
        new BadRequestObjectResult(actionContext.ModelState);
});

По сути, это то, что происходит по умолчанию, поэтому вам просто нужно изменить предоставленное там действие, чтобы настроить его в соответствии с вашими прихотями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...