客戶端傳 `%2B` (URL 編碼的 `+`),服務端 `Request.QueryString["key"]` 取得 `+`,但進一步 `UrlDecode` 變成空格,導致數據錯誤。
ASP.NET **自動對 QueryString 進行一次 UrlDecode**,流程:
// 客戶端 JS
var encoded = encodeURIComponent(encodeURIComponent("+")); // "%252B"
// 服務端自動解碼一次 → "%2B" → 再手動 Decode 一次 → "+"
string raw = Request["key"]; // "%2B"
string real = HttpUtility.UrlDecode(raw); // "+"
// 封裝輔助方法
public static string GetRawQueryString(string key) {
// 從 RawUrl 手動解析,避開 ASP.NET 自動解碼
var rawUrl = HttpContext.Current.Request.RawUrl; // 含查詢字符串原始內容
var queryStart = rawUrl.IndexOf('?');
if (queryStart < 0) return null;
var query = rawUrl.Substring(queryStart + 1);
foreach (var pair in query.Split('&')) {
var kv = pair.Split('=');
if (kv[0] == key) return kv.Length > 1 ? kv[1] : "";
}
return null;
}
// 使用
string raw = GetRawQueryString("key"); // "%2B"
string real = HttpUtility.UrlDecode(raw); // "+"
// 客戶端
var payload = btoa(JSON.stringify({ plus: "+", other: "..." })); // Base64
// 服務端
var json = Encoding.UTF8.GetString(Convert.FromBase64String(Request["payload"]));
var obj = JsonConvert.DeserializeObject>(json);
string plus = obj["plus"]; // 精確得到 "+"
URL 編碼/解碼必須成對出現,且次數對等。ASP.NET 自動解碼一次,客戶端編碼一次 → 服務端無需再解碼;客戶端編碼兩次 → 服務端手動解碼一次。