C#中HttpWebRequest请求含#的密码被截断问题求解
解决C#中HttpWebRequest POST请求URL查询字符串含#被截断的问题
问题原因
URL中的#是片段标识符的起始标记,HTTP客户端会将#之后的内容视为页面内锚点,不会发送到服务器。因此你的密码vigne#ash@Test会被截断为vigne,导致服务器无法获取完整密码。
解决办法
1. 对查询参数进行URL编码
在拼接URL前,对包含特殊字符的参数(如密码)进行URL编码,将#转换为对应的编码值%23,确保完整参数被传递。
C#中可以使用两种方式编码:
- 引用
System.Web程序集,使用HttpUtility.UrlEncode:
using System; using System.Net; using System.Web; var baseUrl = "https://vigneashtesting.com/oauth/token"; var userId = "vigneash"; var password = "vigne#ash@Test"; // 对参数编码 var encodedUserId = HttpUtility.UrlEncode(userId); var encodedPassword = HttpUtility.UrlEncode(password); // 编码后为vigne%23ash%40Test // 拼接完整URL var fullUrl = $"{baseUrl}?login_type=password&userid={encodedUserId}&password={encodedPassword}"; // 创建请求 var request = (HttpWebRequest)WebRequest.Create(fullUrl); request.Method = "POST"; // 后续请求处理逻辑
- 无需额外引用,使用
Uri.EscapeDataString:
var encodedPassword = Uri.EscapeDataString(password);
2. 将参数放在POST请求体中(更安全)
POST请求的参数更适合放在请求体而非URL查询字符串中,这不仅能避免编码问题,还能提升安全性(避免敏感信息暴露在URL日志中)。
示例代码:
using System; using System.Net; using System.Text; using System.Web; var baseUrl = "https://vigneashtesting.com/oauth/token"; var userId = "vigneash"; var password = "vigne#ash@Test"; // 构造表单数据并编码 var postData = $"login_type=password&userid={HttpUtility.UrlEncode(userId)}&password={HttpUtility.UrlEncode(password)}"; var dataBytes = Encoding.UTF8.GetBytes(postData); var request = (HttpWebRequest)WebRequest.Create(baseUrl); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = dataBytes.Length; // 写入请求体 using (var stream = request.GetRequestStream()) { stream.Write(dataBytes, 0, dataBytes.Length); } // 处理响应 using (var response = (HttpWebResponse)request.GetResponse()) { // 读取响应内容逻辑 }
内容的提问来源于stack exchange,提问作者Vigneash Selvaraj
相关产品推荐
相关产品推荐

