【问题标题】:Request not being denied with 413 status code请求没有被拒绝,状态码为 413
【发布时间】:2019-05-24 10:51:46
【问题描述】:

需要拒绝具有任何正文内容的请求(意味着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(OK)响应。我可以毫无问题地调试该方法。看起来 - 过滤器工作正常 - 但由于某种原因它没有触发异常。预期的行为 - 为请求返回“有效负载太大”(413) 状态并且未触发方法中的代码执行。

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

【问题讨论】:

  • 我可能有点傻,但是你的方法返回了 OK?
  • @AsheraH 是的。这个在例子中。这段代码根本不应该被执行。

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


【解决方案1】:

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

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2013-11-14
    相关资源
    最近更新 更多