Подавить ошибки проверки в автоматическом ответе 400. ASP.NET Core - PullRequest
0 голосов
/ 23 апреля 2019

Хотя автоматический ответ 400 полезен, я не хочу отправлять ошибки проверки клиенту.

Это тело ответа:

{
  "errors": {
    "username": [
      "'username' must not be empty."
    ],
    ...more errors
  },
  "title": "One or more validation errors occurred",
  "status": 400,
  "traceId": "xxx:yyy"
}

Но я хочу по умолчанию, без ошибок:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Bad Request",
  "status": 400,
  "traceId": "xxx:yyy"
}

Я думал, что все, что мне нужно было сделать, это установить

options.SuppressUseValidationProblemDetailsForInvalidModelStateResponses = true;

... но это ничего не дает.

Я не хочу отключать эту функцию, я просто хочу подавить ошибки проверки.Как мне это сделать?


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

services.Configure<ApiBehaviorOptions>(apiBehaviorOptions => {
  apiBehaviorOptions.InvalidModelStateResponseFactory = actionContext => {
    var pd    = new ProblemDetails();
    pd.Type   = apiBehaviorOptions.ClientErrorMapping[400].Link;
    pd.Title  = apiBehaviorOptions.ClientErrorMapping[400].Title;
    pd.Status = 400;
    pd.Extensions.Add("traceId", actionContext.HttpContext.TraceIdentifier);
    return new BadRequestObjectResult(pd);
  };
});

1 Ответ

2 голосов
/ 23 апреля 2019

«Сведения о проблеме» соответствуют RFC 7807, который является попыткой стандартизировать способ, которым API-интерфейсы HTTP сообщают об ошибках.SuppressUseValidationProblemDetailsForInvalidModelStateResponses не касается конкретно возврата фактических ошибок валидации, только стандартные биты, обсуждаемые в RFC.

Единственный способ сделать то, что вы хотите, это то, что вы уже сделали, то есть использовать пользовательскийзавод.Это не хак или обходной путь: это документированный способ изменить автоматический ответ.

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

...