Предоставляет ли asp.net core mvc стандартный формат ответа на ошибку? - PullRequest
0 голосов
/ 04 февраля 2019

A ValidationAttribute приводит к следующему формату ошибки:

{
  "errors": {
    "EndDate": [
      "EndDate must be equal to or later than StartDate."
    ]
  },
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "0HLKANM74IPHB:00000005"
}

Я хотел бы написать собственный обработчик ошибок для необработанного исключения.Предоставляет ли asv.net core mvc стандартный формат ответа об ошибке, который я могу использовать повторно?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Начиная с версии 2.1, ASP.NET Core MVC поставляется с классом ProblemDetails, который можно использовать или расширять для предоставления общего формата ответа на ошибку из вашего приложения.Он моделируется после RFC7808 .Ошибка json, опубликованная в вопросе, является экземпляром ValidationProblemDetails, расширенным с ProblemDetails.

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace Microsoft.AspNetCore.Mvc
{
    /// <summary>
    /// A machine-readable format for specifying errors in HTTP API responses based on https://tools.ietf.org/html/rfc7807.
    /// </summary>
    public class ProblemDetails
    {
        /// <summary>
        /// A URI reference [RFC3986] that identifies the problem type. This specification encourages that, when
        /// dereferenced, it provide human-readable documentation for the problem type
        /// (e.g., using HTML [W3C.REC-html5-20141028]).  When this member is not present, its value is assumed to be
        /// "about:blank".
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "type")]
        public string Type { get; set; }

        /// <summary>
        /// A short, human-readable summary of the problem type.It SHOULD NOT change from occurrence to occurrence
        /// of the problem, except for purposes of localization(e.g., using proactive content negotiation;
        /// see[RFC7231], Section 3.4).
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "title")]
        public string Title { get; set; }

        /// <summary>
        /// The HTTP status code([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "status")]
        public int? Status { get; set; }

        /// <summary>
        /// A human-readable explanation specific to this occurrence of the problem.
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "detail")]
        public string Detail { get; set; }

        /// <summary>
        /// A URI reference that identifies the specific occurrence of the problem.It may or may not yield further information if dereferenced.
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "instance")]
        public string Instance { get; set; }

        /// <summary>
        /// Gets the <see cref="IDictionary{TKey, TValue}"/> for extension members.
        /// <para>
        /// Problem type definitions MAY extend the problem details object with additional members. Extension members appear in the same namespace as
        /// other members of a problem type.
        /// </para>
        /// </summary>
        /// <remarks>
        /// The round-tripping behavior for <see cref="Extensions"/> is determined by the implementation of the Input \ Output formatters.
        /// In particular, complex types or collection types may not round-trip to the original type when using the built-in JSON or XML formatters.
        /// </remarks>
        [JsonExtensionData]
        public IDictionary<string, object> Extensions { get; } = new Dictionary<string, object>(StringComparer.Ordinal);
    }
}
0 голосов
/ 04 февраля 2019

То, о чем вы говорите, это просто сериализация из ModelState, которая выполняется автоматически, когда к контроллеру применен атрибут [ApiController], а ModelState.IsValid имеет значение false.Вы можете заменить или изменить это поведение, указав пользовательский InvalidModelStateResponseFactory:

services.Configure<ApiBehaviorOptions>(options =>
{
    options.InvalidModelStateResponseFactory = actionContext => 
    {
        // build the response object you want

        return new BadRequestObjectResult(myErrorResponseObject);
    }
});

Или вы можете полностью отключить этот автоматический ответ 400 и обрабатывать его так, как вам удобно: непосредственно в вашем действии, фильтре настраиваемых действийи т. д.

services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressModelStateInvalidFilter = true;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...