@H_403_0@根据网上搜索到的代码,做了一个测试。结果发现不稳定,有时候能获得JSON数据,有时候则获取不到。 @H_403_0@用HttpAnalyzer跟踪,发现服务器Set-Cookie时,有时候cookie的值没有Version=1,有时候则有Version=1。 @H_403_0@只要返回的Cookie里包含Version=1,则Request的CookieContainer就读不到这个cookie。 @H_403_0@既然读不到Cookie,那么Request就是不包含cookie的,自然不会返回登陆后才能获得的JSON结果了。 @H_403_0@
@H_403_0@进一步发现,凡是Version=1的Cookie,只有Uri=http://site.com时才有,而完整的rq.RequestUri根本就没有。
<pre name="code" class="plain">Dim rq As HttpWebRequest = CType(HttpWebRequest.Create(loginURL),HttpWebRequest) rq.CookieContainer = cc rq.ContentType = "application/x-www-form-urlencoded" rq.Method = "POST" rq.KeepAlive = True '设置HttpWebRequest的CookieContainer为刚才建立的那个cc '把数据写入HttpWebRequest的Request流 Dim rqStream As Stream = rq.GetRequestStream() rqStream.Write(byteArray,byteArray.Length) rqStream.Close() Dim rp As HttpWebResponse = CType(rq.GetResponse,HttpWebResponse) cc1.Add(rp.Cookies) 'MsgBox(rq.RequestUri.Host & "=" & cc1.GetCookieHeader(rq.RequestUri)) 'MsgBox("www.site.com=" & cc1.GetCookieHeader(New Uri("http://www.site.com"))) 'MsgBox("site.com=" & cc1.GetCookieHeader(New Uri("http://site.com")))@H_403_0@上网搜了半天,百度真是垃圾,一点有用的资料都查不到。用google搜,搜出来几篇外国的文字,说这种情况是.net的request的经典BUG。 @H_403_0@还给出了几个修复代码,但是我试了试,没有效果。 @H_403_0@
@H_403_0@整整折腾了一天,突然想到,既然是跟URI有关,那我把所有的Cookie的Domain都强制设置为site.com会不会解决问题呢?
For Each c As Cookie In rp.Cookies c.Domain = ".site.com" c.Version = 0 cc1.Add(c) Next于是删掉 cc1.Add(rp.Cookies),换成上面的代码。 @H_403_0@特别要注意,一定要把Version改成0,只要是1就出问题。 @H_403_0@这样改动之后,问题解决,再也不出错了。 原文链接:https://www.f2er.com/vb/257395.html