Как переопределить ответ 415 в ASP.Net Core2.2 - PullRequest
2 голосов
/ 06 мая 2019

в .net core 2.2, имеет json по умолчанию с кодом состояния 415, например

{
   "type":"https://tools.ietf.org/html/rfc7231#section-6.5.13",
   "title":"Unsupported Media Type",
   "status":415,
   "traceId":"8000003e-0001-f500-b63f-84710c7967bb"
}

Я не знаю, как появился этот JSON.Я следую примеру ниже, чтобы переписать json

Но я получил другой результат, он добавил раздел к оригинальному json.Это мой результат Wireshark

HTTP / 1.1 415 Неподдерживаемый тип носителя Передача-кодировка: chunked

Тип содержимого: приложение / проблема + json;charset = utf-8 Сервер:

Microsoft-IIS / 10.0 X-Powered-By: ASP.NET Дата: Пн, 06 мая 2019 г. 09:03:56 GMT

{
   "type":"https://tools.ietf.org/html/rfc7231#section-6.5.13",
   "title":"Unsupported Media Type",
   "status":415,
   "traceId":"8000002c-0002-fb00-b63f-84710c7967bb"
}
{
   "data":"this is custom message"
}

Фильтр :

public class MediaTypeResouceFilter : Attribute, IResourceFilter
{
    public void OnResourceExecuting(ResourceExecutingContext context)
    {
    }

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        if (context.HttpContext.Response.StatusCode == 415)
        {
            var jsonString = JsonConvert.SerializeObject(new { data = "this is custom message" });
            byte[] data = Encoding.UTF8.GetBytes(jsonString);
            context.HttpContext.Response.Body.WriteAsync(data, 0, data.Length);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Я не знаю, как появился этот JSON.

Когда атрибут [ApiController] применяется к контроллеру, он включает Сведения о проблеме для кодов ошибок , что заканчивается добавлением встроенного фильтра действий в конвейер фильтра MVC для этого контроллера , Этот фильтр действий применяется ко всем кодам состояния> = 400 и создает описанный вами ответ JSON.

Добавлен раздел к оригинальному json

Когда ваш код MediaTypeResouceFilter.OnResourceExecuted выполняется, фильтр действий, который я отметил выше, уже записал JSON в тело. Вы записываете в тело дополнительную строку в формате JSON, которая просто добавляется и отображает ответ как недействительный JSON.

Если вы хотите отключить запись этой проблемы JSON для ответов, вы можете добавить следующее к своему Startup.ConfigureServices коду для подавления функциональности:

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressMapClientErrors = true;
    };
0 голосов
/ 06 мая 2019

Похоже, вы только добавляете в тело, и все, что было записано в тело до того, как ваш фильтр был выполнен, осталось в теле.

Если вы посмотрите на документацию о том, как реализовать фильтр IResource, вы можете достичь своей цели с помощью этой строки кода, но вместо этого внутри OnResourceExecuting:

context.Result = new ContentResult()
{
    Content = jsonString
};

В документации указано, что:

Вы можете замкнуть конвейер фильтра в любой точке, установив свойство Result в параметре context, предоставленном методу filter.

если вы поместите этот код в OnResourceExecuting.

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