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

SslStream发送UTF-8多字节URL编码时%被转义的原因问询

SslStream发送含特殊字符URL时的转义异常

我尝试通过SslStream和StreamWriter发送包含特殊字符的URL GET请求,代码如下:

var req = new HttpRequestMessage( HttpMethod.Get, m_client.BaseAddress );
m_sessionClient.AddSessionInfoTo( req );

var uri = req.RequestUri;

var client = new TcpClient( uri.Host, uri.Port );
Stream stream = client.GetStream();
var ssl = new SslStream( stream );

ssl.AuthenticateAsClient( uri.Host );

var writer = new StreamWriter(
                ssl,
                new UTF8Encoding( encoderShouldEmitUTF8Identifier: false )
);

await writer.WriteAsync( $"{req.Method.Method} " );
await writer.FlushAsync();

var path = "/echo/%C9%52";
var rawPathAndQuery = Encoding.UTF8.GetBytes( path );
await ssl.WriteAsync( rawPathAndQuery, 0, rawPathAndQuery.Length );

await writer.WriteAsync( " HTTP/1.1\r\nHost: " );
await writer.WriteAsync( req.RequestUri.Host );
await writer.WriteAsync( "\r\n" );
await writer.WriteAsync( "\r\n" );
await writer.FlushAsync();

这段代码预期发送的请求路径是/echo/%C9%52(对应字符ÉR),但通过Wireshark捕获到的实际请求却是GET /echo/%25C9R HTTP/1.1——%C9被转义成了%25C9,相当于%字符本身被URL编码了。

这个问题仅出现在多字节UTF-8场景(即编码值≥%80的字符)中。我想知道导致该行为的原因,不需要解决方案。我查过StreamWriter和SslStream的文档,没有找到任何关于UTF-8转义的相关说明,而且在浏览器中直接访问echo/%C9是可以正常工作的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:45:04