You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发本地服务器DLL遇System.IndexOutOfRangeException异常求助

问题分析与修复方案

异常根源

System.IndexOutOfRangeException 触发于 HttpRequest.cs 第87行,本质是解析HTTP请求头时,将空行或格式无效的行按空格拆分后,数组长度不足2,直接访问header[1]导致越界。

核心问题点

  1. 请求头拆分逻辑错误:HTTP请求头标准格式为Header-Name: Value,分隔符是": "(冒号加空格),而非单纯空格。用Split(' ')会把带空格的Value拆成多段,也会把空行/无效行拆成长度不足2的数组。
  2. 未正确识别请求头结束标记:请求头与请求体之间用空行分隔,但代码中line == GlobalConstants.HttpNewLine的判断无效——因为之前用HttpNewLine拆分请求内容后,每行已不含换行符,无法匹配。
  3. 缺乏格式校验:拆分后未检查数组长度,直接访问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();
    }
}

其他潜在问题修复

  1. 请求行验证方法修正:修正拼写错误IsValidReqiestLine为IsValidRequestLine,并修复逻辑漏洞:
bool IsValidRequestLine(string[] requestLine)
{
    // HTTP/1.1请求行必须包含3个部分,且第三部分为HTTP/1.1
    return requestLine.Length == 3 && requestLine[2] == "HTTP/1.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:00:56