ASP.NET 引擎預設會對表單資料自動編碼/解碼,若直接使用 Request.Form.ToString() 取得原始資料再編碼,會導致雙重編碼錯誤。
Client POST 原始資料:a=1&b=2%2B3(%2B 為 + 編碼)。
伺服器端 Request.Form.ToString() 回傳已解碼字串 a=1&b=2+3。若再呼叫 Encoding.GetBytes 送出,+ 會被編碼為 %2B,導致接收端解碼錯誤。
直接讀取 Request.InputStream 取得原始位元組:
byte[] bytesToPost = ReadFully(httpLocalRequest.InputStream);
private byte[] ReadFully(Stream input) {
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream()) {
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0) {
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
避開 ASP.NET 自動解碼機制,確保轉發資料完整性。適用於 Proxy、轉發、簽章驗證等需保留原始請求主體的情境。