Запрос не отклоняется с кодом состояния 413 - PullRequest
0 голосов
/ 24 мая 2019

Необходимо отклонить запросы, которые имеют ЛЮБОЕ содержимое тела (это означает, что body размер> 0).Я попытался использовать атрибут RequestSizeLimit, но он не работает должным образом.

Код:

    [HttpPost]
    [RequestSizeLimit(0)]
    public IActionResult Test()
    {

        return Ok();
    }

Я использую Postman для тестов.Укажите "qwerty" в качестве значения для тела запроса POST.Вот как выглядит Kestrel журнал:

info: Microsoft.AspNetCore.Server.Kestrel [17] Идентификатор соединения "0HLN06I1687S4" неверные данные запроса: "Тело запроса слишком большое." Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Слишком большое тело запроса.Kestrel.Core.Internal.Http.MessageBody.TryStart () в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.ConsumeAsync () в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http.ProcessRequests [TContext] (приложение IHttpApplication 1) в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequestsAsync [TContext] (приложение IHttpApplication 1)

Несмотря на это, я все еще вижуответ 200 (ОК).Я могу отладить метод без проблем.Кажется, что фильтр работает нормально, но по какой-то причине он не вызывает исключений.Ожидаемое поведение - это состояние «слишком большая полезная нагрузка» (413), возвращаемое для запроса, и выполнение кода в методе не инициируется.

Есть идеи или объяснения - почему я вижу такое поведение?

1 Ответ

0 голосов
/ 25 мая 2019

Это не ответ на вопрос, а решение моей проблемы.Я написал собственную реализацию фильтра действий, который работает как положено.

public class PayloadMaximumSizeFilter : ActionFilterAttribute
{
    private long _maxContentLength;
    private string _message;

    public PayloadMaximumSizeFilter(long maxContentLength)
    {
        this._maxContentLength = maxContentLength;
    }

    public PayloadMaximumSizeFilter(long maxContentLength, string message)
    {
        this._maxContentLength = maxContentLength;
        this._message = message;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        long? contentLength = filterContext.HttpContext.Request.ContentLength;
        if (contentLength.HasValue && contentLength.Value > _maxContentLength)
        {
            filterContext.Result = new JsonResult(filterContext.ModelState)
            {
                Value = _message ?? "Request body too large.",
                StatusCode = 413
            };
        }
    }

}
...