gpt4 book ai didi

c# - HttpWebRequest.Headers.Add ("Cookie",值)与 HttpWebRequest.CookieContainer

转载 作者:太空狗 更新时间:2023-10-29 18:31:54 24 4
gpt4 key购买 nike

当我使用 HttpWebRequest.Headers.Add("Cookie",value)HttpWebRequest.CookieContainer 和结果从 HttpWebRequest 获得响应时有区别。

那么,它们之间有什么区别,以及何时使用它们。

最佳答案

根据我的经验,我在使用 HttpWebRequest.CookieContainer 管理 cookie 时遇到了一些问题。它可以在一定程度上起作用,但有时 cookie 不符合 RFC,因此它们无法正确解析到 CookieContainer 中。如果您通过将 cookie 添加到请求的 Cookie header 来手动管理 cookie,您将在某些不符合 RFC 标准的网站上取得更大的成功。 CookieContainer 的问题之一是,如果日期中有带逗号的日期,例如“2013 年 9 月 26 日”,它会将其完全解析为单独的 cookie 并中断解析。另一个问题是在 HTTP 302 重定向上设置的 cookie 不会被 CookieContainer 拾取。

什么最适合您的具体要求取决于您,但如果 CookieContainer 的问题提供的结果与手动设置 cookie header 不同,我建议您坚持手动设置 cookie header 。希望 Microsoft 将来会对此进行更新,以便我们可以重新使用漂亮的 .NET 类来管理 cookie。

编辑:
我遇到了一些正确解析“Set-Cookie” header 的代码。它处理以逗号分隔的 cookie,并提取每个 cookie 的名称、有效期、路径、值和域。

此代码比 Microsoft 自己的 cookie 解析器工作得更好,这确实是官方 cookie 解析器应该做的。我不知道为什么微软还没有解决这个问题,因为这是一个非常普遍的问题。

原始代码如下: http://snipplr.com/view/4427/

我把它贴在这里以防链接在某个时候失效:

public static CookieCollection GetAllCookiesFromHeader(string strHeader, string strHost)
{
ArrayList al = new ArrayList();
CookieCollection cc = new CookieCollection();
if (strHeader != string.Empty)
{
al = ConvertCookieHeaderToArrayList(strHeader);
cc = ConvertCookieArraysToCookieCollection(al, strHost);
}
return cc;
}


private static ArrayList ConvertCookieHeaderToArrayList(string strCookHeader)
{
strCookHeader = strCookHeader.Replace("\r", "");
strCookHeader = strCookHeader.Replace("\n", "");
string[] strCookTemp = strCookHeader.Split(',');
ArrayList al = new ArrayList();
int i = 0;
int n = strCookTemp.Length;
while (i < n)
{
if (strCookTemp[i].IndexOf("expires=", StringComparison.OrdinalIgnoreCase) > 0)
{
al.Add(strCookTemp[i] + "," + strCookTemp[i + 1]);
i = i + 1;
}
else
{
al.Add(strCookTemp[i]);
}
i = i + 1;
}
return al;
}


private static CookieCollection ConvertCookieArraysToCookieCollection(ArrayList al, string strHost)
{
CookieCollection cc = new CookieCollection();

int alcount = al.Count;
string strEachCook;
string[] strEachCookParts;
for (int i = 0; i < alcount; i++)
{
strEachCook = al[i].ToString();
strEachCookParts = strEachCook.Split(';');
int intEachCookPartsCount = strEachCookParts.Length;
string strCNameAndCValue = string.Empty;
string strPNameAndPValue = string.Empty;
string strDNameAndDValue = string.Empty;
string[] NameValuePairTemp;
Cookie cookTemp = new Cookie();

for (int j = 0; j < intEachCookPartsCount; j++)
{
if (j == 0)
{
strCNameAndCValue = strEachCookParts[j];
if (strCNameAndCValue != string.Empty)
{
int firstEqual = strCNameAndCValue.IndexOf("=");
string firstName = strCNameAndCValue.Substring(0, firstEqual);
string allValue = strCNameAndCValue.Substring(firstEqual + 1, strCNameAndCValue.Length - (firstEqual + 1));
cookTemp.Name = firstName;
cookTemp.Value = allValue;
}
continue;
}
if (strEachCookParts[j].IndexOf("path", StringComparison.OrdinalIgnoreCase) >= 0)
{
strPNameAndPValue = strEachCookParts[j];
if (strPNameAndPValue != string.Empty)
{
NameValuePairTemp = strPNameAndPValue.Split('=');
if (NameValuePairTemp[1] != string.Empty)
{
cookTemp.Path = NameValuePairTemp[1];
}
else
{
cookTemp.Path = "/";
}
}
continue;
}

if (strEachCookParts[j].IndexOf("domain", StringComparison.OrdinalIgnoreCase) >= 0)
{
strPNameAndPValue = strEachCookParts[j];
if (strPNameAndPValue != string.Empty)
{
NameValuePairTemp = strPNameAndPValue.Split('=');

if (NameValuePairTemp[1] != string.Empty)
{
cookTemp.Domain = NameValuePairTemp[1];
}
else
{
cookTemp.Domain = strHost;
}
}
continue;
}
}

if (cookTemp.Path == string.Empty)
{
cookTemp.Path = "/";
}
if (cookTemp.Domain == string.Empty)
{
cookTemp.Domain = strHost;
}
cc.Add(cookTemp);
}
return cc;
}

关于c# - HttpWebRequest.Headers.Add ("Cookie",值)与 HttpWebRequest.CookieContainer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18998354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com