首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 後端請求遠端站點完全指南:HttpWebRequest GET/POST 實戰與編碼陷阱

     編輯:關於ASP.NET

伺服器端代碼需主動呼叫外部 HTTP API(支付回調、第三方介面、微服務聚合)。本文詳細示範 HttpWebRequest 同步 GET/POST 完整流程,含參數編碼、流處理、異常處理、超時控制。

核心命名空間

using System.Net;   // HttpWebRequest, HttpWebResponse
using System.IO;    // Stream, StreamReader, StreamWriter
using System.Text;  // Encoding

GET 請求範例

public string HttpGet(string url) {
    var uri = new Uri(url);
    if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps)
        throw new ArgumentException("僅支援 HTTP/HTTPS");

    var request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = "GET";
    request.Timeout = 10000; // 10 秒
    request.UserAgent = "MyApp/1.0";

    using (var response = (HttpWebResponse)request.GetResponse())
    using (var stream = response.GetResponseStream())
    using (var reader = new StreamReader(stream, Encoding.UTF8))
        return reader.ReadToEnd();
}

POST 請求範例(application/x-www-form-urlencoded)

public string HttpPost(string url, Dictionary<string, string> parameters) {
    var uri = new Uri(url);
    var request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.Timeout = 15000;

    // 參數編碼:UrlEncode 每個值,再用 & 連接
    var postData = string.Join("&", 
        parameters.Select(kvp => $"{WebUtility.UrlEncode(kvp.Key)}={WebUtility.UrlEncode(kvp.Value)}"));
    var byteData = Encoding.UTF8.GetBytes(postData);
    request.ContentLength = byteData.Length;

    using (var stream = request.GetRequestStream())
        stream.Write(byteData, 0, byteData.Length);

    using (var response = (HttpWebResponse)request.GetResponse())
    using (var stream = response.GetResponseStream())
    using (var reader = new StreamReader(stream, Encoding.UTF8))
        return reader.ReadToEnd();
}

關鍵陷阱與最佳實踐

陷阱症狀解決方案
參數未 UrlEncode特殊字符 (+, &, =, 空格, 中文) 導致伺服器解析錯誤WebUtility.UrlEncode 每個值(.NET 4.5+)
未設定 ContentLengthPOST 請求被伺服器拒絕 (411 Length Required)寫入流前設定 request.ContentLength = byteData.Length
同步阻塞執行緒高併發下執行緒池耗盡、回應延遲改用 HttpClient + async/await(.NET 4.5+)
忽略 SSL 憑證驗證測試環境自簽憑證拋出異常ServicePointManager.ServerCertificateValidationCallback += (s, c, ch, e) => true;(僅開發/測試)
未關閉響應流連線洩漏、連線池耗盡using 區塊確保釋放
編碼不一致中文亂碼統一 UTF-8:請求流、響應流、UrlEncode 均指定 Encoding.UTF8

現代替代方案:HttpClient(強烈推薦)

private static readonly HttpClient _client = new HttpClient { Timeout = TimeSpan.FromSeconds(15) };

public async Task<string> GetAsync(string url) 
    => await _client.GetStringAsync(url);

public async Task<string> PostAsync(string url, Dictionary<string, string> parameters) {
    var content = new FormUrlEncodedContent(parameters); // 自動 UrlEncode
    var response = await _client.PostAsync(url, content);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
}
  • HttpClient 為線程安全、支援連線池、非同步優先、自動處理壓縮/重導向/Keep-Alive。
  • 全域單例模式避免 Socket 耗盡(HttpClient 設計為長壽命)。
  • .NET Core / .NET 5+ 內建 IHttpClientFactory 管理生命週期、啟用 Polly 重試/熔斷。

安全性提醒

  • 敏感參數(Token、密碼)勿放入 URL QueryString(日誌、瀏覽器歷史、Proxy 記錄均可見),改用 POST Body 或 Header。
  • 驗證回應狀態碼(EnsureSuccessStatusCode),處理 4xx/5xx 業務邏輯。
  • 設定合理 Timeout,避免慢速下游拖垮上游。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved