lin*_*lnk 1 c# cookies system.net.httpwebrequest
我正在尝试做一些自动化的Web请求,需要从一个到另一个维护一个cookie.我可以看到我从初始响应中获取了我想要的cookie,但我无法将其附加到下一个请求中.
c#代码
// response part
using (var wresp = (System.Net.HttpWebResponse)wrequest.GetResponse())
{
// respblob gets returned and is accessible to the next request
respblob.CookieList = new List<System.Net.Cookie>();
foreach (System.Net.Cookie cook in wresp.Cookies)
{
respblob.CookieList.Add(cook);
}
// ... more stuff not related to cookies
}
// next request part
var wrequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
wrequest.Method = "POST";
wrequest.ContentType = "application/x-www-form-urlencoded";
wrequest.CookieContainer = new System.Net.CookieContainer();
// request.CookieList contains one cookie as expected
// from the previous response
for (int j = 0; j < request.CookieList.Count; j++)
{
wrequest.CookieContainer.Add(request.CookieList[j]);
}
// .... write data to request body
// ... complete the request, etc
Run Code Online (Sandbox Code Playgroud)
这是两个请求/响应操作的记录交换.
请求:
GET http://domain.com/Login.aspx?ReturnUrl=%2fDefault.aspx HTTP/1.1
Host: domain.com
Connection: Keep-Alive
Run Code Online (Sandbox Code Playgroud)
响应:
HTTP/1.1 200 OK
Date: Tue, 15 May 2012 17:17:52 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=zzz4fpb4alwi1du2yavx5tah; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 24408
...html content...
Run Code Online (Sandbox Code Playgroud)
下一个请求:
POST http://domain.com/Login.aspx?ReturnUrl=%2fDefault.aspx HTTP/1.1
Host: domain.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 979
Expect: 100-continue
__LASTFOCUS=&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=viewstateclipped&__EVENTVALIDATION=validationclipped&ctl00%2524ContentPlaceHolder1%2524Login1%2524LoginButton=&ctl00%2524ContentPlaceHolder1%2524Login1%2524UserName=my.email%40example.com&ctl00%2524ContentPlaceHolder1%2524Login1%2524Password=myPassword
Run Code Online (Sandbox Code Playgroud)
因此即使cookie存在于HttpWebRequest CookieContainer中,它也不会随请求一起发送.我究竟做错了什么?
Dar*_*rov 13
您应该对正在使用CookieContainer的两个HttpWebRequest对象使用相同的实例.只需创建一次CookieContainer实例:
var cookieContainer = new CookieContainer();
Run Code Online (Sandbox Code Playgroud)
然后让您的两个请求对象都使用此实例:
var request1 = (HttpWebRequest)WebRequest.Create("http://example.com/url1");
// assign the cookie container for the first request
request1.CookieContainer = cookieContainer;
... go ahead and send the request and process the response
var request2 = (HttpWebRequest)WebRequest.Create("http://example.com/url2");
// reuse the same cookie container instance as the first request
request2.CookieContainer = cookieContainer;
... go ahead and send the request and process the response
Run Code Online (Sandbox Code Playgroud)
由于您对两个请求使用相同的CookieContainer,因此当第一个请求将cookie存储在此容器中时,cookie将自动与第二个请求一起发出.这当然假定第二个请求与第一个请求属于同一个域.
此外,由于cookie是会话cookie(HttpOnly标志),因此您无法从客户端读取其值.