【问题标题】:How to read only a specific part from HTTP Response body如何从 HTTP 响应正文中仅读取特定部分
【发布时间】:2026-01-31 11:45:01
【问题描述】:

我只需要从下面的响应正文中读取mode 段。

grant_type=password&username=demouser&password=test123&client_id=500DWCSFS-D3C0-4135-A188-17894BABBCCF&mode=device

我使用下面的函数来读取 HTTP 正文,它给了我整个正文。如何在不使用子字符串或更改 seek() 中的值的情况下截断 mode 段:bodyStream.BaseStream.Seek(3, SeekOrigin.Begin);

var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream);
bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
var bodyText = bodyStream.ReadToEnd();

【问题讨论】:

  • 你试过bodyStream.ReadBlock()方法了吗?
  • @SimonH.不,我试试,谢谢
  • “不使用子字符串”背后的原因是什么?
  • @SimonH。 ReadBlock() 还请求参数以指定起始索引。无法指定索引,因为索引可能会根据用户名和密码的长度而变化
  • @Fildor,请参考上面的评论。谢谢

标签: c# httpresponse httpcontext seek


【解决方案1】:

你不能。 HTTP 使用 TCP,这要求您无论如何都要阅读整个正文,您不能“搜索”到 TCP 流中。好吧,你可以,但这仍然会读取整个正文并丢弃未使用的部分。

所以你读取整个流,你有意义地解析它,因为另一个参数也可以包含字符串“mode”,它也可以在开头,所以你也不能搜索&mode

鉴于这是一个表单帖子,您可以直接访问Request.Form["mode"]。如果您确实想自己解析:

string formData;
using (reader = new StreamReader(HttpContext.Current.Request.InputStream))
{
    formData = reader.ReadToEnd();
}

var queryString = HttpUtility.ParseQueryString(formData);
var mode = queryString["mode"];

【讨论】:

  • 感谢@CodeCaster。这就是我要的。 +1