开发本地服务器DLL遇System.IndexOutOfRangeException异常求助
问题分析与修复方案
异常根源
System.IndexOutOfRangeException 触发于 HttpRequest.cs 第87行,本质是解析HTTP请求头时,将空行或格式无效的行按空格拆分后,数组长度不足2,直接访问header[1]导致越界。
核心问题点
- 请求头拆分逻辑错误:HTTP请求头标准格式为
Header-Name: Value,分隔符是": "(冒号加空格),而非单纯空格。用Split(' ')会把带空格的Value拆成多段,也会把空行/无效行拆成长度不足2的数组。 - 未正确识别请求头结束标记:请求头与请求体之间用空行分隔,但代码中
line == GlobalConstants.HttpNewLine的判断无效——因为之前用HttpNewLine拆分请求内容后,每行已不含换行符,无法匹配。 - 缺乏格式校验:拆分后未检查数组长度,直接访问
header[0]和header[1]。
修复代码
修改ParseHeaders方法
void ParseHeaders(string[] headerLines) { foreach (var line in headerLines) { var trimmedLine = line.Trim(); // 遇到空行,说明请求头结束 if (string.IsNullOrEmpty(trimmedLine)) { break; } // 按第一个": "拆分,确保带空格的Value不被拆分 string[] headerParts = trimmedLine.Split(new[] { ": " }, 2, StringSplitOptions.None); if (headerParts.Length < 2) { // 无效请求头格式,返回400错误 throw new BadRequestException(); } // HTTP头名称不区分大小写,统一转小写存储 string headerName = headerParts[0].Trim().ToLower(); string headerValue = headerParts[1].Trim(); Headers.AddHeader(new HttpHeader(headerName, headerValue)); } // HTTP/1.1要求必须包含Host头,修正原逻辑的错误判断 if (!Headers.ContainsHeader("host")) { throw new BadRequestException(); } }
其他潜在问题修复
- 请求行验证方法修正:修正拼写错误
IsValidReqiestLine为IsValidRequestLine,并修复逻辑漏洞:
bool IsValidRequestLine(string[] requestLine) { // HTTP/1.1请求行必须包含3个部分,且第三部分为HTTP/1.1 return requestLine.Length == 3 && requestLine[2] == "HTTP/1.1"; }
- 请求内容读取逻辑优化:原读取逻辑的终止条件不可靠,改为检测请求结束标记(
\r\n\r\n)确保完整读取请求头:
private async Task<HttpRequest> ReadRequest() { var result = new StringBuilder(); var data = new byte[1024]; while (true) { int numberOfBytes = await this.client.ReceiveAsync(data, SocketFlags.None); if (numberOfBytes == 0) break; var bytesAsString = Encoding.UTF8.GetString(data, 0, numberOfBytes); result.Append(bytesAsString); // 检测请求头结束的空行标记 if (result.ToString().Contains(GlobalConstants.HttpNewLine + GlobalConstants.HttpNewLine)) { break; } } if (result.Length == 0) { return null; } return new HttpRequest(result.ToString()); }
修复说明
- 改用
": "拆分请求头,避免带空格的Value被错误拆分。 - 遇到空行立即终止解析,防止处理请求体内容。
- 增加格式校验,无效请求头直接返回400错误。
- 修正Host头的判断逻辑(HTTP/1.1强制要求Host头存在)。
- 优化请求读取逻辑,确保完整获取请求内容。
内容的提问来源于stack exchange,提问作者Darg
相关产品推荐
相关产品推荐

