不会用413状态代码拒绝请求

时间:2019-05-24 10:51:47

标签: c# asp.net-core-2.1 kestrel-http-server

需要拒绝具有任何正文内容(即body的大小> 0)的请求。我尝试使用RequestSizeLimit属性,但似乎无法正常工作。

代码:

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

        return Ok();
    }

我正在使用Postman进行测试。提供“ qwerty”作为POST请求正文的值。 Kestrel日志如下所示:

  

信息:Microsoft.AspNetCore.Server.Kestrel [17]         连接ID“ 0HLN06I1687S4”的错误请求数据:“请求正文太大。”   Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException:   请求正文太大。在   Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException.Throw(RequestRejectionReason   原因)   Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1MessageBody.ForContentLength.OnReadStarting()   在   Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.TryStart()   在   Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.ConsumeAsync()   在   Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests [TContext](IHttpApplication 1   申请)   Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequestsAsync [TContext](IHttpApplication 1   应用程序)

尽管如此-我仍然看到200(确定)响应。我可以毫无问题地调试该方法。看起来-过滤器工作正常-但由于某种原因,它不会触发异常。预期的行为-请求的状态为“有效载荷过大”(413),并且未触发方法中的代码执行。

任何想法或解释-为什么我会看到这种行为?

1 个答案:

答案 0 :(得分:0)

这不是对问题的答案,而是对我的问题的解决方案。我已经编写了自己的动作过滤器实现,可以按预期工作。

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
            };
        }
    }

}