【问题标题】:VB.NET - [HTTP POST] Response.Cookies is only returning first cookie valueVB.NET - [HTTP POST] Response.Cookies 只返回第一个 cookie 值
【发布时间】:2014-02-15 01:15:47
【问题描述】:

我正在使用以下代码循环访问响应 cookie 并将它们保存在 cookiejar 中。

    For Each tempCookie As Cookie In Response.Cookies
        CookieJar.Add(tempCookie)
        MsgBox(tempCookie.ToString)
    Next

碰巧它只返回一个cookie,第一个(只在for中运行一次):

 PAGE_VIS=A|186.213.98.144|1381089446.485193|

Response.Cookies 上只有一个 cookie,但 Response.Headers 拥有所有这些。

我如何从 Response.Headers 中解析它们并添加 on cookiecontainer 以便以后使用它们? Response.Headers 中的 cookie 在这里:

Set-Cookie: PAGE_VIS=A|186.213.98.144|1381089446.485193|; domain=PAGE; path=/; expires=Mon, 07-Oct-2013 06:00:00 GMT,CSASF=;Version=1;Domain=PAGE;Path=/;Max-Age=7776000,CSAPAGES=ekpEOWluWTZSMXpDSWRMMm8wWWZ3UT09|5749|kNm6h4hlOB4SwLFg2gOIMXXpmTXDD5tnvB/dJ7AS3mUqUiLtpHLxzsWjfKsI1rcq6fp/DKre3QHAZHPQi968iw==;Version=1;Domain=PAGE;Path=/;Max-Age=7776000;HttpOnly,NAM_LOGIN_DEFAULT=user;Version=1;Domain=PAGE;Path=/;Max-Age=129600,UPL09=2-25|39|54|56|58|90|91|105|106|156|182|212|218|219|242|245|248|284|285|480|1222;Version=1;Domain=PAGE;Path=/;Max-Age=2592000,PAGE_OTR=;Version=1;Domain=PAGE;Path=/;Max-Age=2592000,CAUBR01=5eeOUuDdqyj+ILCQ7oOg71yXEgIGi2KJ7bjDiTt27tTXgjT7jqC49eGprgjZ+8rQ7O7mqG/qEq28u4EXAiEbfE0qqI9QqUrj27LrEAi4kSZacSSTAo5YY+yQZYFr4qGgCp18odS/Y92mkEtqEuCoxuG+qsK5fhOJmKQqqpxqE07ORqEn2JGEhOHVmoQqqKCqEq78+2EMqtKZlrvMqv2qmKMqEqqOIqZ72NKGRxO2mKeskKwkZq2CH7GrC+GGoKOCqOVmqEOqEkbr82EjqcGKVHoQqn2qkEMqKk2xLqEk20EEtSr2qo2kqErqEqqODqZh7YKGtxK2mCesmEMsGqVSTMZb24EKuMrTqw2qqEoqEqqK92ZUMnKZsOKqmo2kqEOkEq2KzqKpVvKZlOCMqo7qqGMmKq2oMeEiMXGZBKMqqOQqqKxqZsqv2VK32tEG+Cr7kH2qqEKqEmqCT7G726ZGgK9qsxVmqKOqGkqMkrKVq1ZENoOesKMqmZKqKq7x82G1ehGKWxKVmoqqqZCsEqVOqqE/2JKZJOKMqK2sqZMkKqJOCMZb7YEKKMKTqCqqmGosGqVxq2EHqgKE0rKqqKqqqKCkEq7xJqGieDGKUKKVmoqqqZCsKq7KCqZ/VDKZZKCMqw7kqGMmKqqoQeK+MsGZpKMqqKuqqKxqZsqKb2EXC8GZkKO2kO9sqKOqEkQxmqGTeQKKIHK/qoqqqZxsKq9OdqGZ2sKZoKKMqK2msZMkEqQKbMZI7PKK3MKVqCqqmEosGqVKHqZBc9KGOxoqqMesqKtqKqMK/2ZFqtZZEOKqqO2kqGosGq2KfcKxqhEKq9xQqK7qsGOqZqeoQMZn7NGK2MK7qCqqmZokGqVKsqZjuLKGjxo7qMesqGwqKqMCj7G07AZGwK9qqxVmqKoqGkqMorKwqsZG4ooesOMqmZKqKq2xA2Kh2aEETMw2kO7qqEoqEq7MLVKIqfEGRoo/qKMqsZKqEq7xr7GxeMGKutKVmoqqqZCsGqcK9qZGVHKZCrCMqO7qqGMmKqQo3eZeMoGZ8KMqqrqkqKxqZsqrtVKrqhGGUCx7qKQqsGKqZmerqMZF79ZKRMKbkCqqmKokGqVKzqZGCZKGTxoQqMesqZ8kKqMCG7GhQFZECKnqqxVmqKrqGmqMKMKUqjZZXoresKMqsZKqZk7xcQGzeHGKB4KVmOqqkZCsZqTrF2Z07gEGstKbqCqqmGOsGqVKeqZ52DKGhxobqMesqECkKqMCD7GLb8ZKxKoqqxVmqKwqGqqM/QKqq9ZEqowesKMqkZKqEk7x0bGreJGKlvKVmoqqkZCsEqJKbqZuViKZDwCMqH7mqGMmKqboQeEtM0GZHKMqqw9kqKxqZsqM7VKsq9GGoCx7mKbqsGKqZmewdMZV7VEKeMK/kCqqmKosGqVK0qZseQKGqxobqMesqKSkKqMC97GOuBZEkKKqqxVmqKvqGqqMe7KEqDZKDovesKMqkZKqZk7x6uGEedGKtwKVmoqqkZCsKquKjqGHVtKZTvCMq97kqGMmKquoNeKJMrGZXKMqqvrkqKxqZsqxEVKqqFKGQCx7mKuqsGKqZmevrMZm7wKKdMKVkCqqmEosGqVKLqZecvKGNxouqMesqKtkKqMCv7GbJjZZ1KOqqxVmqK8qGqqMlqKyqLZGIo8esKMqqZKqGk7xFJGuetGK/rKVmoqqkZCsGqbKsqKKVsKZr8CMq87kqGMmKqJoteGYMqGZGKMqq8CkqKxqZsqnzVKdq3EGZCx7mKJqsGKqZme8xMZQ7TGKsMKMkCqqmZosGqVKDqZFThKGxxoJqMesqG4kKqMCo7G7C0ZGFKCqqxVmqK8qGsqM72KSqiZZwo9esKMqqZKqKm7mGVC;Version=1;Domain=PAGE;Path=/


为什么它没有获取所有其余的 cookie,只获取第一个?
我该如何解决?

这里的整个函数:

Private Function LogonPage(ByVal URL As String, ByRef CookieJar As CookieContainer, ByVal PostData As String)
    Dim reader As StreamReader

    Dim Request As HttpWebRequest = HttpWebRequest.Create(URL)

    Request.Method = "POST"
    Request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14"
    Request.CookieContainer = CookieJar
    Request.AllowAutoRedirect = False
    Request.ContentType = "application/x-www-form-urlencoded"
    Request.ContentLength = PostData.Length

    Dim requestStream As Stream = Request.GetRequestStream()
    Dim postBytes As Byte() = Encoding.ASCII.GetBytes(PostData)

    requestStream.Write(postBytes, 0, postBytes.Length)
    requestStream.Close()

    Dim Response As HttpWebResponse = Request.GetResponse()

    For Each tempCookie As Cookie In Response.Cookies
        CookieJar.Add(tempCookie)
    Next

    reader = New StreamReader(Response.GetResponseStream())
    Return reader.ReadToEnd()
    Response.Close()
End Function


你能告诉我我做错了什么,如果可能的话,请指出解决方案? 非常感谢。

【问题讨论】:

    标签: .net vb.net cookies


    【解决方案1】:

    如果有多个 cookie,Set-Cookie 标头可能包含用逗号分隔的 cookie ,,而 cookie 属性由分号 ; 分隔,Response.Headers("Set-Cookie") 会返回 string 中的所有 cookie。

    1. Response.Headers("Set-Cookie") 上应用 cookie 分离技术
    2. 提取每个 cookie 的名称、值、路径、域等
    3. 使用此信息创建 Cookie 对象
    4. 将 cookie 添加到 CookieContainer

    请注意,用逗号分隔 cookie , 没有用,因为任何 cookie 属性(如 expires)也可能包含逗号,如 expires=Mon, 07-Oct-2013 06:00 :00 GMT:

    Dim strCookies As String = Response.Headers("Set-Cookie")
    
    ' Splitting on comma is just for example
    Dim cookies() As String = strCookies.Split(commaDelimeter, StringSplitOptions.RemoveEmptyEntries)
    
    For Each ck As String In cookies
        Dim ckProp() As String = ck.Split(semicolonDelimeter, StringSplitOptions.RemoveEmptyEntries)
        Dim cookie As New Cookie(ckProp(0), ckProp(1))
        CookieJar.Add(cookie)        
    Next ck
    

    【讨论】:

    • 它比我想象的更复杂,正确解析它的唯一方法是使用正则表达式我猜:c
    • 另外,为什么 Response.Cookies 没有得到所有这些?
    • 是的,您可以使用正则表达式,但不确定它为什么会这样。
    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 2013-02-13
    • 2020-11-20
    • 1970-01-01
    • 2021-08-22
    • 2014-12-05
    相关资源
    最近更新 更多