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

HttpClient自动编码URL致状态码异常,如何获取正确400状态码?

问题描述

我有一个链接:

58.87.64.22/?{{%25}}cake=1

在Chrome中打开该链接时,服务器返回正确的400状态码,但使用HttpClient发送请求时却返回200:

HttpClient client = new HttpClient();
var w = await client.GetAsync("http://58.87.64.22/?{{%25}}cake\\=1");

原因是HttpClient会自动对URL中的特殊字符进行编码,最终发送的URL变为:

58.87.64.22/?%7B%7B%25%7D%7Dcake%5C=1

这个编码后的URL在Chrome中测试也会返回200,我需要让HttpClient发送请求时能获取到400状态码,该如何解决?

解决方案

核心是阻止HttpClient自动编码需要保留的特殊字符,让请求URL和Chrome发送的完全一致,以下是几种可行方法:

方法一:基于基Uri构造请求Uri

使用Uri的重载构造函数,基于基地址构造相对Uri,这种方式不会对已包含编码字符的部分再次编码,同时保留原始特殊字符:

var baseUri = new Uri("http://58.87.64.22/");
var requestUri = new Uri(baseUri, "?{{%25}}cake\\=1");

HttpClient client = new HttpClient();
var response = await client.GetAsync(requestUri);

方法二:使用UriBuilder构造请求地址

通过UriBuilder直接设置Query属性,避免自动编码:

var builder = new UriBuilder("http://58.87.64.22/");
builder.Query = "{{%25}}cake\\=1";

HttpClient client = new HttpClient();
var response = await client.GetAsync(builder.Uri);

方法三:手动构造HttpRequestMessage

直接创建HttpRequestMessage对象并指定原始URL,绕过GetAsync(string)的自动编码逻辑:

var request = new HttpRequestMessage(HttpMethod.Get, "http://58.87.64.22/?{{%25}}cake\\=1");

HttpClient client = new HttpClient();
var response = await client.SendAsync(request);
原理说明

HttpClient.GetAsync(string)方法会默认对URL中的特殊字符(如{、}、\)执行URL编码,导致最终请求地址与Chrome的原始请求不一致。上述方法通过直接构造Uri对象或手动设置查询字符串,避免了自动编码行为,确保请求URL与Chrome发送的完全相同,从而得到预期的400状态码。

内容的提问来源于stack exchange,提问作者Inside Man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:42:22