Почему ядро ​​ASP.Net возвращает 400 по умолчанию, если запрос не Json, когда он должен - PullRequest
0 голосов
/ 16 октября 2018

В соответствии с Microsoft и Mozilla документами код состояния 415:

Microsoft:

HTTP_STATUS_UNSUPPORTED_MEDIA

415

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

Mozilla

Код ответа об ошибке клиента HTTP 415 Unsupported Media Type указывает, что сервер отказывается принять запрос, потому что формат полезной нагрузки находится в неподдерживаемом формате.

Почему, если я устанавливаю содержимоевведите JSON и отправьте XML в качестве тела запроса. Я получаю 400 по умолчанию, когда мне нужно получить 415?

Каков наилучший способ получить 415, если запрос не в допустимом формате JSON?Я добился этого с помощью фильтра ресурсов, но я думаю, что было бы бесполезно читать тело запроса дважды каждый раз , если есть другой способ.

вот мой код:

public class MyResourceFilter:Attribute, IResourceFilter
{
    public void OnResourceExecuting(ResourceExecutingContext context)
    {
        context.HttpContext.Request.EnableRewind();
        var requestBodyText = new StreamReader(context.HttpContext.Request.Body).ReadToEnd();
        context.HttpContext.Request.Body.Position = 0;
        try
        {
            JsonConvert.DeserializeObject<object>(requestBodyText);
        }
        catch (Exception e)
        {
            context.Result= new UnsupportedMediaTypeResult();
        }
    }

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
    }
}

1 Ответ

0 голосов
/ 16 октября 2018

Неверно возвращать 415 в этом случае.Этот код состояния буквально означает, что сервер не поддерживает mime-тип, который в данном случае равен application/json.Сервер очень поддерживает этот тип, поэтому он не вернет 415. Неправильный запрос 400 - это правильный код состояния ответа, который вы хотите вернуть, потому что вы сказали, что это JSON, но вместо этого вы отправили XMLт. е. вы сделали неверный запрос .

...