我正在尝试使用ASP.NET网站创建一个HttpWebRequest / HttpWebResponse会话,以便稍后通过url params解析HTML表单(这部分我知道该怎么做),但我不明白如何解析和设置一个cookie,例如会话ID。在Fiddler中,它显示ASP.NET会话ID是通过Set-Cookie在对url的/ path请求的响应中返回的,但是如何提取此会话ID并将其设置为下一个HttpWebRequest的cookie ?我知道这个Set-Cookie标头可以在HttpWebResponse.Headers.Keys中找到,但有解析它的直接路径吗?谢谢!
答案 0 :(得分:56)
.NET框架将为您管理cookie。您不必担心从标头中解析cookie信息或在请求中添加cookie标头。
要存储和发送您的会话ID,请使用Cookie
和CookieContainer
类来存储它们,然后确保在每次请求时都发送Cookie。
以下示例显示了如何执行此操作。 CookieContainer,“cookieJar
”可以跨多个域和请求共享。将它添加到请求对象后,对它的引用也将在返回响应时添加到响应对象中。
CookieContainer cookieJar = new CookieContainer();
var request = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com");
request.CookieContainer = cookieJar;
var response = request.GetResponse();
foreach (Cookie c in cookieJar.GetCookies(request.RequestUri))
{
Console.WriteLine("Cookie['" + c.Name + "']: " + c.Value);
}
此代码的输出将为:
Cookie['PREF']: ID=59e9a22a8cac2435:TM=1246226400:LM=1246226400:S=tvWTnbBhK4N7Tlpu
答案 1 :(得分:7)
丹·赫伯特的答案对我帮助很大。感谢您的帮助。
只想发布我的用法 - 希望它在某些时候帮助某人。我的要求是我需要将第一个http帖子回复中的cookie发送回第二个http post请求。
第一
CookieContainer cookieJar = new CookieContainer();
request.CookieContainer = cookieJar;
....
CookieCollection setCookies = cookieJar.GetCookies(request.RequestUri);
第二
CookieContainer cc = new CookieContainer();
cc.Add(setCookies);
request.CookieContainer = cc;
答案 2 :(得分:5)
我有同样的问题(与亚马逊) 我使用以下正则表达式:
string regexp = "(?<name>[^=]+)=(?<val>[^;]+)[^,]+,?";);
MatchCollection myMatchCollection = Regex.Matches(cookiesStr, regexp);
foreach (Match myMatch in myMatchCollection)
{
string cookieName = myMatch.Groups["name"].ToString();
string cookieVal = myMatch.Groups["val"].ToString();
Cookie cookie = new Cookie(cookieName, cookieVal);
cookies.Add(cookie);
}
请注意,我只关心cookie名称/值...
祝你好运 Elia的答案 3 :(得分:1)
来自第一个回复的Cookie,在302(重定向)状态的情况下不包括'set cookie'作为标头中的Cookie(例如某些会话ID ...)
如果autofollowredirect设置为true,则处理设置cookie,并且自动完成的后续请求将包括第一次调用时由set cookie定义的cookie
如果autofollowredirect设置为false,那么第一个请求不会获得由设置cookie定位的cookie,我猜这也是我的任务,如果有人知道,这是随后在下一个请求中使用这些cookie的唯一方法,解析设置的cookie?