如何使用RestSharp发送多个请求同时保留会话状态?
实现带CSRF验证的会话保持请求流程(C# RestSharp)
核心要点
- RestClient默认会自动维护Cookie容器,复用同一个client实例即可保留会话信息(Cookie、请求头等),无需重新创建。
- 先发送GET请求获取页面中的CSRF令牌,再构造POST请求提交JSON数据并携带该令牌。
修正后的完整代码
// 初始化RestClient,复用该实例以保持会话 var client = new RestClient("https://example.com"); var getRequest = new RestRequest(); getRequest.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36"); // 发送GET请求获取CSRF令牌 var getResponse = client.Execute(getRequest); if (getResponse.StatusCode == System.Net.HttpStatusCode.OK) { string sourceContent = Uri.UnescapeDataString(getResponse.Content); // 从响应内容中解析CSRF令牌(需确保Parse方法逻辑正确) string csrfToken = Parse(sourceContent, "RpsCsrfState%3d", "&"); // 构造POST请求,指定目标接口URL var postRequest = new RestRequest("https://example.com/your-post-endpoint", Method.Post); postRequest.RequestFormat = DataFormat.Json; // 添加CSRF请求头(注意头名称需和目标站点要求一致,比如X-CSRF-Token) postRequest.AddHeader("csrf", csrfToken); // 构造JSON请求体 string jsonBody = "{\"userId\":\"asd\",\"password\":\"welcome\"}"; postRequest.AddStringBody(jsonBody, ContentType.Json); // 发送POST请求,会话Cookie自动携带 var postResponse = client.Execute(postRequest); } // 补充Parse方法实现:从指定字符串中截取start和end之间的内容 private string Parse(string content, string startMarker, string endMarker) { int startIndex = content.IndexOf(startMarker) + startMarker.Length; int endIndex = content.IndexOf(endMarker, startIndex); if (startIndex > -1 && endIndex > startIndex) { return content.Substring(startIndex, endIndex - startIndex); } return string.Empty; }
关键修正说明
- 会话保持:全程复用同一个
RestClient实例,它会自动存储和发送Cookie,无需手动处理。 - 请求隔离:GET和POST请求使用独立的
RestRequest对象,避免参数污染;POST请求需明确指定目标接口URL。 - CSRF令牌解析:补充了
Parse方法的具体实现,确保能正确从响应内容中提取CSRF值(若目标站点的CSRF存储位置不同,需调整解析逻辑)。 - 请求头与请求体:确保POST请求的Content-Type为
application/json,CSRF头名称需匹配目标站点的要求。
内容的提问来源于stack exchange,提问作者mahvettin
相关产品推荐
相关产品推荐

