【问题】
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的,然后还是自己写函数实现了:
// convert cookie to cookie string public string convertCookieToStr(Cookie ck) { string cookieStr = ""; cookieStr += ck.Name + "=" + ck.Value; cookieStr += "; path=" + ck.Path; cookieStr += "; domain=" + ck.Domain; return cookieStr; }//convertCookieToStr // convert CookieCollection to cookies string public string convertCookieToStr(CookieCollection cookies) { string cookiesStr = ""; //foreach (Cookie ck in cookies) for (int i = 0; i < cookies.Count; i++ ) { Cookie ck = cookies[i]; if (i == 0) { cookiesStr += convertCookieToStr(ck); } else { cookiesStr += "," + convertCookieToStr(ck); } } return cookiesStr; }//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)] |
但是,想要去添加对应的wininet.dll的引用的时候,发现通过Recent里面去找到system32下面的wininer.dll,无法添加:
然后通过COM中添加,却也没找到这个wininet。
只看到有个winhttp.dll。
后来发现,原来是自己傻掉了,其实DllImport显示红色错误,其实只需要按照之前:
中说的,添加一句:
using System.Runtime.InteropServices;
即可。不需啊去添加对应的wininet.dll的。
进过尝试,代码是可以执行的:
foreach (Cookie ck in cookies) { InternetSetCookie(url, ck.Name, ck.Value); }
但是呢,结果却很让人失望,对应的cookie,看来是没有传递到WebBrowser中,导致打开的网页,还是未登陆状态的页面。
后来加了:
bool setOk = InternetSetCookie(url, ck.Name, ck.Value);
验证了cookie的设置,是true的,但是打开的页面,的确是没有显示登录状态的。
后来参考:Pass cookie to WebBrowser control,中提到的:
也还是和之前看到的一样的。
后来在:
How can i get webbrowser’s session cookie(memory)?
中找到了微软官方关于cookie的解释:
但是还是没解决问题。
虽然上面通过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设置正确的,但是此网页特殊,导致没有显示登录状态。