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

.NET Core中如何原样获取HttpContext.Request用于SHA256哈希?

解决HttpContext读取请求体后SHA256哈希不一致的问题

你遇到的核心问题是当前代码通过反序列化对象再调用ToString()的方式,无法还原原始请求的字节/字符串格式——反序列化会丢失原始JSON的格式细节(比如空格、换行、键的顺序),而ToString()默认输出的是对象类型名(或自定义的非原始格式字符串),这必然导致哈希计算结果和原始请求不符。

正确的做法是直接读取请求体的原始字节或原始字符串,再基于这些原始数据计算哈希。

方案一:直接读取原始字节计算哈希(最准确)

哈希本质是基于字节流计算的,直接读取原始字节能完全匹配在线工具的计算逻辑:

// 保存原始流位置,读完后恢复,避免影响后续中间件
var originalBodyPosition = httpContext.Request.Body.Position;
try
{
    // 将请求体流重置到起始位置
    httpContext.Request.Body.Seek(0, SeekOrigin.Begin);

    // 读取全部原始字节
    using var memoryStream = new MemoryStream();
    await httpContext.Request.Body.CopyToAsync(memoryStream);
    var rawRequestBodyBytes = memoryStream.ToArray();

    // 计算SHA256哈希
    using var sha256 = SHA256.Create();
    var hashBytes = sha256.ComputeHash(rawRequestBodyBytes);
    // 转换为十六进制字符串(可根据需求调整大小写)
    var hashString = Convert.ToHexString(hashBytes).ToLowerInvariant();

    // 如果需要反序列化对象,基于原始字节处理
    var bodyContent = JsonSerializer.Deserialize<YourTargetType>(rawRequestBodyBytes);
}
finally
{
    // 恢复请求体流的原始位置
    httpContext.Request.Body.Seek(originalBodyPosition, SeekOrigin.Begin);
}

方案二:读取原始字符串计算哈希

如果需要先获取原始请求的字符串,注意要使用和请求一致的编码(通常为UTF-8):

var originalBodyPosition = httpContext.Request.Body.Position;
try
{
    httpContext.Request.Body.Seek(0, SeekOrigin.Begin);
    // leaveOpen: true 确保StreamReader不会关闭请求体流
    using var streamReader = new StreamReader(httpContext.Request.Body, Encoding.UTF8, leaveOpen: true);
    var rawRequestBodyString = await streamReader.ReadToEndAsync();

    // 基于原始字符串转成的字节计算哈希(必须和原始请求编码一致)
    var rawBytes = Encoding.UTF8.GetBytes(rawRequestBodyString);
    using var sha256 = SHA256.Create();
    var hashBytes = sha256.ComputeHash(rawBytes);
    var hashString = Convert.ToHexString(hashBytes).ToLowerInvariant();

    // 反序列化对象
    var bodyContent = JsonSerializer.Deserialize<YourTargetType>(rawRequestBodyString);
}
finally
{
    httpContext.Request.Body.Seek(originalBodyPosition, SeekOrigin.Begin);
}

关键注意事项

  • 必须重置请求体流位置:读取后流指针会移到末尾,必须恢复原始位置,否则后续中间件无法读取请求体。
  • 编码一致性:确保使用的编码和原始请求一致(大部分场景是UTF-8),否则会导致字节转换错误。
  • 避免反序列化后转字符串:反序列化再转字符串会丢失原始JSON的格式细节(如空格、键顺序),绝对不能用这种方式计算哈希。

内容的提问来源于stack exchange,提问作者Tomas Shelby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:45:48