C#从字符串创建cookie并发送它
本文关键字:并发 cookie 创建 字符串 | 更新日期: 2023-09-27 18:21:55
我想向HTTP服务器发出POST请求,但我需要在请求中"包含"一个cookie,我有cookie,但我不知道如何处理cookie容器
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.Accept = "text/javascript, text/html, application/xml, text/xml, */*";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Host = "url.com";
request.UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11";
request.Referer = "http://url.com";
request.Headers.Add("X-Requested-With", "XMLHttpRequest");
request.Headers.Add("X-Prototype-Version", "1.7");
request.Headers.Add("Accept-Encoding: gzip, deflate");
这是一个示例cookie:
Cookie最近访问的AppHubs=233450%2C231430%2C48110%2C45760;语言=西班牙语;strInventoryLastContext=440_2;__utma=268881843.118202637.1372069740.13742452.1373473085.10__utmb=268881843.21.10.1373473085__utmz=268881843.1373473085.10.4.utmcsr=google|utmccn=(有机)|utmcmd=有机|utmctr=(未提供%20);rgTopicView_General_4312225=%7B%222828934913396342649%22%3A%2221373450285%22%2C%222846939615003500718%22%3A1373473557%7D;时区偏移=7200,0;sessionid=NDExNjE1NDE5;登录=765611979917322708A9C768;steamRememberLogin=76561197991732272;__utma=268881843.118202637.1372069740.13742452.1373473085.10__utmb=268881843.22.10.1373473085__utmc=268881843__utmz=268881843.1373473085.10.4.utmcsr=谷歌|utmccn=(有机)|utmcmd=有机|utmctr=(未提供%20)
但我不知道如何将该cookie转换为cookie容器,然后将其添加到请求中。要求CookieContainer=cookie;
String CookieStr = "recentlyVisitedAppHubs=233450%2C231430%2C48110%2C45760;
Language=spanish; strInventoryLastContext=440_2";
CookieContainer cookiecontainer = new CookieContainer();
string[] cookies = CookieStr.Split(';');
foreach (string cookie in cookies)
cookiecontainer.SetCookies(new Uri("http://url.com"), cookie);
request.CookieContainer = cookiecontainer;
//build uri and cookie
Uri uri = new Uri("domain");
Cookie cookie = new Cookie("name", "value");
//build request
HttpWebRequest request = WebRequest.Create("domain") as HttpWebRequest;
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(uri, cookie);
资源:
- https://stackoverflow.com/a/546512/1927071
- http://msdn.microsoft.com/en-us/library/a18ka3h2.aspx
- http://msdn.microsoft.com/en-us/library/system.net.cookie.aspx
- http://msdn.microsoft.com/en-us/library/system.net.cookiecontainer_methods.aspx
很抱歉"匆匆忙忙;代码,但这是我将字符串解析为cookie选项、键和值的方法。
public class CookieWithOptions
{
CookieOptions options { get; set; } = new CookieOptions();
string Key { get; set; } = default!;
string Value { get; set; } = default!;
}
public static class CookieProperties
{
public const string Expires = "expires";
public const string Expired = "expired";
public const string Path = "path";
public const string Domain = "domain";
public const string Secure = "secure";
public const string SameSite = "sameSite";
public const string HttpOnly = "httpOnly";
public const string MaxAge = "maxAge";
public const string IsEssential = "isEssential";
}
从ExtractCookie方法获取CookieWithOptions:
var cookie = ExtractCookie(cookieString);
ExtractCookie实现:
private CookieWithOptions ExtractCookie(string cookieString)
{
CookieWithOptions cookie = new();
var parts = cookieString!.Split("; ");
var claims = new Dictionary<string, string>();
foreach (var part in parts)
{
var keyValuePair = part.Split('=');
claims.Add(keyValuePair.First(), keyValuePair.Last());
}
SetCookieOptions(claims, cookie);
return cookie;
}
SetCookieOptions:
public void SetCookieOptions(
Dictionary<string, string> claims,
CookieWithOptions cookie)
{
foreach (var claim in claims)
{
switch (claim.Key)
{
case CookieProperties.Expires:
cookie.Options.Expires = DateTime.ParseExact(
claim.Value,
"ddd, d MMM yyyy HH:mm:ss GMT",
CultureInfo.GetCultureInfoByIetfLanguageTag("en-us"),
DateTimeStyles.AdjustToUniversal);
break;
case CookieProperties.Secure:
cookie.Options.Secure = bool.Parse(claim.Value);
break;
case CookieProperties.IsEssential:
cookie.Options.IsEssential = bool.Parse(claim.Value);
break;
case CookieProperties.SameSite:
cookie.Options.SameSite = Enum.Parse<SameSiteMode>(claim.Value);
break;
case CookieProperties.Path:
cookie.Options.Path = claim.Value;
break;
case CookieProperties.Domain:
cookie.Options.MaxAge = TimeSpan.Parse(claim.Value);
break;
case CookieProperties.HttpOnly:
cookie.Options.HttpOnly = bool.Parse(claim.Value);
break;
default:
cookie.Key = claim.Key;
cookie.Value = claim.Value;
break;
}
}
}
还要确保CookieProperties
中的两个单词选项(例如isEssential)的格式正确,因为我不确定它是否应该保持camelCase:)