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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:20:42