ASP.NET Core中能否安全捕获并忽略BadHttpRequestException异常?
关于ASP.NET中
BadHttpRequestException的处理疑问 我们运营着一个高流量网站,峰值时段用户会快速浏览大量页面,此时日志中频繁出现如下异常:
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Unexpected end of request content. at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1ContentLengthMessageBody.ReadAsyncInternal(CancellationToken cancellationToken) at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.ReadAsyncInternal(Memory`1 destination, CancellationToken cancellationToken) at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token) at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.ReadAsync(Memory`1 buffer, CancellationToken cancellationToken) at System.IO.StreamReader.ReadBufferAsync(CancellationToken cancellationToken) at System.IO.StreamReader.ReadAsyncInternal(Memory`1 buffer, CancellationToken cancellationToken) at Newtonsoft.Json.JsonTextReader.ReadDataAsync(Boolean append, Int32 charsRequired, CancellationToken cancellationToken) at Newtonsoft.Json.JsonTextReader.ParseValueAsync(CancellationToken cancellationToken) [...]
该异常出现在ASP.NET值提供过程中,对应类似如下代码场景:
var stream_reader = new StreamReader(context.ActionContext.HttpContext.Request.Body); var json_reader = new JsonTextReader(stream_reader); bool success = await json_reader.ReadAsync();
我无法在调试环境复现该异常,推测是用户在XHR请求过程中跳转页面,浏览器中断请求、未发送承诺的负载导致。相关信息零散,当前异常已严重充斥日志。
核心问题
能否安全地捕获并忽略此处的BadHttpRequestException异常?是否会遗漏关键错误?有没有明确的相关信息?
解答
是否应该忽略该异常
可以安全捕获并忽略这类特定的BadHttpRequestException(错误信息为Unexpected end of request content),不会遗漏关键错误。
该异常的触发场景
这类异常的典型触发场景包括:
- 用户在请求发送完成前主动中断操作(比如跳转页面、关闭标签页、刷新页面),浏览器直接终止正在发送的请求,导致服务器端未接收到完整请求内容;
- 网络不稳定导致请求传输中途中断,客户端发送的负载不完整;
- 少量爬虫或恶意请求故意发送不完整的请求内容,但这类情况占比极低,忽略此类异常不会影响服务稳定性。
这类异常属于客户端触发的非致命错误,服务器端无法提前预防,捕获并忽略不会影响正常业务逻辑,反而能减少日志噪音,方便排查真正的服务端问题。
内容的提问来源于stack exchange,提问作者Dirk Boer
相关产品推荐
相关产品推荐

