c# - 似乎全局异常处理程序正在重新抛出 **BadHttpRequestException: Unexpected end of request content** 作为未处理的异常
问题描述
我的 ASP .NET Core WebAPI 应用程序收到一些无法识别的请求,导致以下错误。
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException:请求内容意外结束。
此错误仅记录在 kestrel (stdout_logfile) 中,而不是应用程序的错误日志中。似乎全局异常处理程序正在将异常重新抛出为未处理的异常。
随着请求的不断到来,应用程序变得缓慢并崩溃,最终重新启动主管以启动应用程序。
错误日志:
^[[41m^[[30mfail^[[39m^[[22m^[[49m: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Unexpected end of request content.
at Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException.Throw(RequestRejectionReason reason)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1ContentLengthMessageBody.ReadAsyncInternal(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.ReadAsyncInternal(Memory`1 buffer, CancellationToken cancellationToken)
at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
at Microsoft.AspNetCore.WebUtilities.StreamHelperExtensions.DrainAsync(Stream stream, ArrayPool`1 bytePool, Nullable`1 limit, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinder.BindModelAsync(ModelBindingContext bindingContext)
at Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, Object value)
at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
代码
异常过滤代码:
public void ConfigureServices(IServiceCollection services)
{
...
...
services.AddControllers()
.ConfigureApiBehaviorOptions(options =>
{
options.SuppressConsumesConstraintForFormFileParameters = true;
options.SuppressInferBindingSourcesForParameters = true;
options.SuppressModelStateInvalidFilter = true;
options.SuppressMapClientErrors = true;
options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
"https://httpstatuses.com/404";
options.InvalidModelStateResponseFactory = context =>
{
var result = new BadRequestObjectResult(context.ModelState);
// TODO: add `using System.Net.Mime;` to resolve MediaTypeNames
result.ContentTypes.Add(MediaTypeNames.Application.Json);
result.ContentTypes.Add(MediaTypeNames.Application.Xml);
return result;
};
});
services.AddControllers(options =>
options.Filters.Add(new HttpResponseExceptionFilter())
);
...
...
}
为什么在下面的全局处理程序中没有捕获到错误,或者为什么错误被重新抛出为未处理的异常。我在这里做错了什么?
异常处理代码:
public void OnActionExecuted(ActionExecutedContext context)
{
if (context.Exception is HttpResponseException exception)
{
logger.Error(context.Exception);
context.Result = new ObjectResult(exception.Value)
{
StatusCode = exception.Status,
};
context.ExceptionHandled = true;
}
else if (context.Exception is BadHttpRequestException badException)
{
logger.Error(context.Exception);
context.Result = new ObjectResult(badException.Data.Values)
{
StatusCode = badException.StatusCode,
};
context.ExceptionHandled = true;
}
else if (context.Exception is Exception otherException)
{
logger.Error(context.Exception);
context.Result = new ObjectResult(otherException.Data.Values)
{
StatusCode = otherException.HResult,
};
context.ExceptionHandled = true;
}
}
解决方案
推荐阅读
- javascript - 在 API 服务器上保存 html 元素
- reactjs - 如何解决生产中无样式内容的 Flash?
- excel - VBA自定义函数在子程序中工作但不在工作表中
- python - 用于类不平衡的 catboost 分类器?
- javascript - 我无法覆盖 React Bootstrap 组件
- java - Java - 读取和搜索 CSV 文件并显示结果
- javascript - Javascript拖放功能问题
- tsql - 捕获动态 T-SQL 的结果
- javascript - 如何根据我的数组填充 3 个下拉框和 1 个输入框?HTML Javascript
- php - 如何在javascript中将数据导入数据库和phpMyAdmin