首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# 模擬登錄網站返回 500 錯誤的排查:請求頭、Cookie、表單字段需完全模擬瀏覽器行為

     編輯:程式設計疑難解答

500 錯誤本質

服務器內部錯誤,通常因請求參數不合法(缺少必要字段、格式錯誤、簽名驗證失敗)導致後端拋出未捕獲異常。

排查清單

  1. 抓包對比:使用 Fiddler/Charles 記錄瀏覽器正常登錄的完整請求(Headers、Cookies、Form Data)。
  2. 逐字段複製:在 C# 中設置 HttpWebRequest 的所有 Header:
    • User-Agent(必須與瀏覽器一致)
    • Referer(登錄頁 URL)
    • Origin、Content-Type、Accept、Accept-Language 等
  3. 隱藏表單字段:登錄頁常包含 _token、csrf_token、_t 等動態字段,**必須先 GET 登錄頁解析 HTML 獲取**,再攜帶提交 POST。
  4. Cookie 管理:使用 CookieContainer 自動處理 Set-Cookie/重定向 Cookie。
  5. 編碼一致:Encoding.UTF8.GetBytes(postData) 對應 Content-Type: application/x-www-form-urlencoded; charset=UTF-8。

代碼關鍵修正

// 1. 先 GET 登錄頁獲取動態 token
string loginPage = GetHtml(loginUrl, cookieContainer, header);
string token = Regex.Match(loginPage, "name=\"_token\" value=\"([^\"]+)\"").Groups[1].Value;

// 2. POST 登錄攜帶所有字段
string postData = $"email={Uri.EscapeDataString(email)}&password={Uri.EscapeDataString(pwd)}&_token={token}";
byte[] postBytes = Encoding.UTF8.GetBytes(postData);
request.ContentLength = postBytes.Length;
// ... 寫入流、獲取響應

工具推薦

  • HttpClient (System.Net.Http):現代替代 HttpWebRequest,支持 async/await、自動解壓、連接池。
  • Flurl.Http:鏈式調用,極簡語法:await url.PostUrlEncodedAsync(data).ReceiveString()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved