最新消息:VPS服务器又从fzhost.net换回Linode了,主题仍用朋友推荐的大前端D8

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

C# crifan 379浏览 0评论

【问题】

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)]

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

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

can not add wininet

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

can not find wininet

只看到有个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的。

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

                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,中提到的:

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设置正确的,但是此网页特殊,导致没有显示登录状态。

转载请注明:在路上 » 【未解决】C#中将已获得的cookie传递给WebBrowser控件

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (3)

  1. 请问下朋友已经解决这个问题了吗?
    jzelynn5年前 (2013-04-26)回复
    • 没有。
      crifan5年前 (2013-04-26)回复
      • 我这几天遇到和你相同的问题,目前已经解决了 cookie加一个过期时间即可 + ";expires=Sun,22-Feb-2099 00:00:00 GMT"
        crazy4年前 (2014-05-19)回复
19 queries in 0.219 seconds, using 9.85MB memory