Отображать куки как ключ = значение для всех доменов? - PullRequest
1 голос
/ 16 мая 2010

Этот вопрос относится к использованию производного класса WebClient с поддержкой cookie, представленного в Как я могу заставить WebClient использовать Cookies? вопрос.

Я бы хотел использовать ListBox для ...

1) отображать каждый файл cookie в отдельности как «ключ = значение» (цикл «Для каждого» отображает их все как одну строку), а

2) иметь возможность отображать все файлы cookie независимо от домена, с которого они пришли («www.google.com», здесь):

Imports System.IO
Imports System.Net

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim webClient As New CookieAwareWebClient
        Const URL = "http://www.google.com"
        Dim response As String

        response = webClient.DownloadString(URL)
        RichTextBox1.Text = response

        'How to display cookies as key/value in ListBox?
        'PREF=ID=5e770c1a9f279d5f:TM=1274032511:LM=1274032511:S=1RDPaKJKpoMT9T54
        For Each mycc In webClient.cc.GetCookies(New Uri(URL))
            ListBox1.Items.Add(mycc.ToString)
        Next
    End Sub
End Class

Public Class CookieAwareWebClient
    Inherits WebClient

    Public cc As New CookieContainer()
    Private lastPage As String

    Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest
        Dim R = MyBase.GetWebRequest(address)
        If TypeOf R Is HttpWebRequest Then
            With DirectCast(R, HttpWebRequest)
                .CookieContainer = cc
                If Not lastPage Is Nothing Then
                    .Referer = lastPage
                End If
            End With
        End If
        lastPage = address.ToString()
        Return R
    End Function
End Class

Спасибо.


Редактировать: С помощью приведенного ниже кода я по-прежнему получаю однострочный ключ = значение вместо отдельных пар ключ = значение, которые мне нужно отобразить:

'How to display cookies as key=value in ListBox?
'still displayed as key=PREF value=ID=c1c024db87787437:TM=1274083167:LM=1274083167:S=ZsG7BXqbCe7yVgJY
Dim mycookiecollection As CookieCollection
mycookiecollection = webClient.cc.GetCookies(New Uri(URL))
Dim mycookie As Cookie
For Each mycookie In mycookiecollection
    ListBox1.Items.Add(mycookie.Name & vbTab & mycookie.Value)
    'MessageBox.Show(mycookie.Name & vbTab & mycookie.Value)
Next

Редактировать: Оказывается, Google вернул один файл cookie с ключом = PREF и значением = объединением нескольких элементов ключ = значение.

Для тех, кто заинтересован, вот некоторый код для разбора части значения:

For Each ck As Cookie In cookies
    Dim ht As New Web.HttpCookie(ck.Name, ck.Value.Replace(":", "&"))
    If ht.HasKeys Then
        Debug.WriteLine(ht.Name)
        For Each key In ht.Values.AllKeys
            Debug.WriteLine(vbTab & key & vbTab & ht.Values(key))
        Next
    Else
        Debug.WriteLine(ht.Name & vbTab & ht.Value)
    End If
Next

Ответы [ 3 ]

1 голос
/ 17 мая 2010
CookieContainer cookies = new CookieContainer();

// do something to get some cookies

Hashtable domains= 
    (Hashtable) typeof (CookieContainer)
    .GetField("m_domainTable", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(cookies);

foreach (DictionaryEntry domain in domains)
{
    CookieCollection domainCookies = cookies.GetCookies(new Uri("http://" + domain.Key));

    foreach (Cookie cookie in domainCookies)
    {
        Console.WriteLine("Domain:{0}, Path:{1}, Port:{2}, Name:{3}, Value:{4}", cookie.Domain, cookie.Path, cookie.Port, cookie.Name, cookie.Value);
    }

}
0 голосов
/ 17 мая 2010

Объект CookieContainer имеет метод GetCookies , который возвращает CookieCollection.

0 голосов
/ 16 мая 2010

Класс Cookie имеет свойства Name и Value, которые можно использовать вместо вызова ToString(), что создает только строку, подходящую для использования в заголовке HTTP.

Невозможно перечислить домены, для которых в контейнере cookie есть файлы cookie, поэтому вам придется также вести список доменов, чтобы вы могли использовать GetCookies для получения файлов cookie для каждого из доменов.

...