将HttpWebRequest POST请求迁移至HttpRequestMessage的等价性验证
HttpWebRequest 迁移至 HttpRequestMessage 的疑问解答
疑问1:HttpWebRequest 是否必须以字节形式发送数据?
HttpWebRequest 不强制要求开发者手动以字节形式处理数据,但 HTTP 协议的请求体本质是二进制流,所有最终要发送的内容都必须转换为字节。旧代码的写法是 HttpWebRequest 的标准实现方式——因为它没有提供直接设置字符串请求体的 API,所以需要手动将字符串编码为字节数组,再写入请求流。
疑问2:新旧代码是否等价?如何修正?
两段代码不等价,新代码存在几个关键问题:
- 错误地将
Content-Type添加到请求 Headers 中:Content-Type属于请求体的元数据,应该由HttpContent对象的 Headers 来管理,直接加到 request Headers 会被StringContent的默认值覆盖。 - 未明确指定
StringContent的编码和 ContentType:旧代码明确用 UTF-8 编码发送 XML 格式数据,新代码的StringContent默认会使用text/plain; charset=utf-8的 ContentType,与旧代码的application/xml不符。 - 新代码中对
postData执行了RSAEncryptDecrypt.EncryptResponse加密操作,而旧代码直接发送原始字符串,这会导致请求体内容完全不同(如果这不是预期的新增逻辑,需要修正)。
修改后的新代码
// postData -> 待发送的数据(string 类型) var request = new HttpRequestMessage(HttpMethod.Post, address); request.Headers.Add("Accept", "application/xml"); // 明确指定编码为 UTF-8,ContentType 为 application/xml var content = new StringContent(postData, Encoding.UTF8, "application/xml"); request.Content = content; // 如果确实需要加密,保留 EncryptResponse 调用,否则移除 // var content = new StringContent(RSAEncryptDecrypt.EncryptResponse(postData), Encoding.UTF8, "application/xml"); await _client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
等价性说明
修正后的代码与旧代码逻辑一致:
- 同样使用 UTF-8 编码将字符串转换为字节
- 正确设置
Content-Type: application/xml和Accept: application/xml - 请求体内容与旧代码一致(如果移除了额外的加密操作)
内容的提问来源于stack exchange,提问作者Nimrod
相关产品推荐
相关产品推荐

