【问题】

C#中,已经登陆12306网站,获得对应的cookie值了,此时希望将已经获得的cookie,传递到另外一个WebBrowser控件中去,期望已获得,在WebBrowser控件中打开对应url,是已经登陆时候的状态的页面。

【解决过程】

1.看到:C#中webbrowser控件cookie问题,中有提到

this.cookie = this.webBrowser1.Document.Cookie; 

所以打算将对应的已经获得的CookieCollection类型的curCookies赋值过去,但是发现this.cookie是string类型。 

所以需要将原先的CookieCollection变量,转化为cookie字符串,然后赋值给this.cookie。不过觉得此办法貌似很麻烦。暂时先不用。另寻别的方法。 

2.看到:WebBrowser设置Cookie,中用到InternetSetCookie,但发现,貌似也不是我所需要的,因为其还是一个个cookie的方法,去设置对应的值,而不是直接使用cookie或者CookieCollection的。 

3.最后发现,貌似还是需要将cookie或CookieCollection转换为string的,然后还是自己写函数实现了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// convert cookie to cookie string
publicstringconvertCookieToStr(Cookie ck)
{
stringcookieStr = "";
cookieStr += ck.Name + "="+ ck.Value;
cookieStr += "; path="+ ck.Path;
cookieStr += "; domain="+ ck.Domain;
returncookieStr;
}//convertCookieToStr
// convert CookieCollection to cookies string
publicstringconvertCookieToStr(CookieCollection cookies)
{
stringcookiesStr = "";
//foreach (Cookie ck in cookies)
for(inti = 0; i < cookies.Count; i++ )
{
Cookie ck = cookies[i];
if(i == 0)
{
cookiesStr += convertCookieToStr(ck);
}
else
{
cookiesStr += ","+ convertCookieToStr(ck);
}
}
returncookiesStr;
}//convertCookieToStr

然后再去调用赋值:

wbsBuyTicket.Document.Cookie = cookiesStr;

不过好像是还是无法政策执行,调试发现,在访问.Document.Cookie的时候:

MessageBox.Show(wbsBuyTicket.Document.Cookie);

就会出错的:

{"Object reference not set to an instance of an object."}

总之,此法好像还有行不通。

4.打算还是参考:WebBrowser设置Cookie,去使用InternetSetCookie,然后添加了代码:

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]

public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);

但是,想要去添加对应的wininet.dll的引用的时候,发现通过Recent里面去找到system32下面的wininer.dll,无法添加:

【未解决】C#中将已获得的cookie传递给WebBrowser控件_C#

然后通过COM中添加,却也没找到这个wininet。

【未解决】C#中将已获得的cookie传递给WebBrowser控件_传递给WebBrowser控件_02

只看到有个winhttp.dll。

后来发现,原来是自己傻掉了,其实DllImport显示红色错误,其实只需要按照之前:

【已解决】error CS0246: The type or namespace name ‘DllImport’ could not be found (are you missing a using directive or an assembly reference?)

中说的,添加一句:

using System.Runtime.InteropServices;

即可。不需啊去添加对应的wininet.dll的。

进过尝试,代码是可以执行的:

1
2
3
4
foreach(Cookie ck incookies)
{
InternetSetCookie(url, ck.Name, ck.Value);
}

但是呢,结果却很让人失望,对应的cookie,看来是没有传递到WebBrowser中,导致打开的网页,还是未登陆状态的页面。

后来加了:

bool setOk = InternetSetCookie(url, ck.Name, ck.Value);

验证了cookie的设置,是true的,但是打开的页面,的确是没有显示登录状态的。

 

后来参考:Pass cookie to WebBrowser control,中提到的:

http://social.msdn.microsoft.com/Forums/en-US/winformsdesigner/thread/e43239f3-3914-43ec-ac50-223b022ec2ea

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/a9083c75-0dd6-46bb-926d-c7872d2844d6/

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/e6061150-7eaf-4a7c-9e37-c752de4fca51

也还是和之前看到的一样的。

后来在:

How can i get webbrowser’s session cookie(memory)?

中找到了微软官方关于cookie的解释:

HTTP Cookies

Managing Cookies

但是还是没解决问题。

虽然上面通过InternetSetCookie设置了cookie,但是wbsBuyTicket.Document.Cookie的值还是没变的,所以看了设置的cookie,也只是本地数据库中的cookie,和当前webbrowser中的cookie,不是一回事。

5.后来调试发现,通过:

string cookiesStr = crl.convertCookieToStr(cookies);;

wbsBuyTicket.Document.Cookie = cookiesStr;

是可以设置cookie的,但是不是期望的结果,不是期望的:

旧的cookie清空,设置了新的cookie的值,

实际的是:

cookiesStr 为:

"JSESSIONID=45FCE2B2A7A45644B2CA856AD62AF575; path=/otsweb; domain=dynamic.12306.cn,BIGipServerotsweb=2396258570.62495.0000; path=/; domain=dynamic.12306.cn"

而执行:

wbsBuyTicket.Document.Cookie = cookiesStr;

之前:

wbsBuyTicket.Document.Cookie为:

"JSESSIONID=3D22F0D500AB180CAC7B1B924D145F36; BIGipServerotsweb=2278818058.62495.0000"

执行之后:

wbsBuyTicket.Document.Cookie为:

"JSESSIONID=3D22F0D500AB180CAC7B1B924D145F36; BIGipServerotsweb=2278818058.62495.0000; JSESSIONID=45FCE2B2A7A45644B2CA856AD62AF575"

新增了个JSESSIONID,旧的BIGipServerotsweb也没变。

而就算调试过程中手动去改wbsBuyTicket.Document.Cookie的值,结果也只会将wbsBuyTicket.Document.Cookie变得更复杂,比如想要手动修改为:

"JSESSIONID=45FCE2B2A7A45644B2CA856AD62AF575;BIGipServerotsweb=2396258570.62495.0000"

但是改了后,变成了:

"JSESSIONID=45FCE2B2A7A45644B2CA856AD62AF575; JSESSIONID=3D22F0D500AB180CAC7B1B924D145F36; BIGipServerotsweb=2278818058.62495.0000; JSESSIONID=45FCE2B2A7A45644B2CA856AD62AF575"

貌似cookie还是不能按照所期望的方式去修改。

 

截止目前,还不知道,到底是cookie没有设置正确,还是cookie设置正确的,但是此网页特殊,导致没有显示登录状态。

http://www.crifan.com/pass_existed_cookie_to_webbrowser_in_csharp/