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;

C#从字符串创建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:)