在處理支付寶、銀聯等金融介面時,常需從原始 Cookie 字串中提取並動態替換 JSESSIONID 等關鍵 Token。由於 Cookie 內容動態變化、格式雜亂(包含 Path、HttpOnly、Secure 等屬性),單純字串取代極易出錯。本文提供結構化解析與安全替換方案。
///
/// 將原始 Cookie 字串解析為鍵值對集合,自動處理屬性片段
///
public static Dictionary ParseCookie(string rawCookie)
{
var dict = new Dictionary(StringComparer.OrdinalIgnoreCase);
if (string.IsNullOrWhiteSpace(rawCookie)) return dict;
// 以分號分割,每段可能為 "key=value" 或 "key=value; Path=/; HttpOnly"
foreach (var part in rawCookie.Split(';'))
{
var kv = part.Trim().Split(new[] { '=' }, 2);
if (kv.Length == 2)
{
// 僅取第一個 "=" 前為 key,後為 value(忽略後續屬性)
dict[kv[0].Trim()] = kv[1].Trim().Split(';')[0].Trim();
}
}
return dict;
}
public static string ReplaceCookieValue(string rawCookie, string targetKey, string newValue)
{
var dict = ParseCookie(rawCookie);
if (dict.ContainsKey(targetKey))
{
dict[targetKey] = newValue;
}
// 重組為標準 "k1=v1; k2=v2" 格式(不帶屬性,供請求標頭使用)
return string.Join("; ", dict.Select(kv => $"{kv.Key}={kv.Value}"));
}
// 使用範例
string original = "cna=xxx; JSESSIONID=9B4B199EEB702BEE2B7D516BA1CB6F8C; Path=/; HttpOnly; ...";
string newJsId = "RZ056Dar6pgE6inNmivJBB3ya80WKxauthRZ05GZ00";
string updatedCookie = ReplaceCookieValue(original, "JSESSIONID", newJsId);
// 直接塞入 HttpRequestMessage.Headers.Add("Cookie", updatedCookie);
若下游系統要求保留 Path、Secure、HttpOnly 等屬性,可擴充模型:
public class CookieItem
{
public string Name { get; set; }
public string Value { get; set; }
public string Path { get; set; } = "/";
public bool HttpOnly { get; set; }
public bool Secure { get; set; }
public DateTime? Expires { get; set; }
public string Domain { get; set; }
public string SameSite { get; set; } = "Lax";
public override string ToString() =>
$"{Name}={Value}; Path={Path}; HttpOnly={(HttpOnly ? "true" : "false")}; Secure={(Secure ? "true" : "false")}" +
(Expires.HasValue ? $"; Expires={Expires.Value:R}" : "") +
(string.IsNullOrEmpty(Domain) ? "" : $"; Domain={Domain}") +
$"; SameSite={SameSite}";
}
解析時用正則完整捕獲屬性,替換 Value 後 ToString() 即可得到標準 Set-Cookie 格式。
+、%),替換前後請確認是否需 Uri.EscapeDataString。StringComparer.OrdinalIgnoreCase。Domain 屬性分組管理,避免跨站 Cookie 洩漏。採用結構化解析取代硬編碼 Split/Replace,不僅程式碼可讀性大增,更能應對金融級介面頻繁變動的 Cookie 格式,是 C# 開發者處理 HTTP 狀態管理的必備技能。