需要拒绝具有任何正文内容(即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),并且未触发方法中的代码执行。
任何想法或解释-为什么我会看到这种行为?
答案 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
};
}
}
}