【问题标题】:How can I get the WebClient to use Cookies?如何让 WebClient 使用 Cookie?
【发布时间】:2010-05-13 08:39:03
【问题描述】:

我希望 VB.net WebClient 记住 cookie。

我已经搜索并尝试了许多重载类。

我想通过 POST 登录一个网站,然后 POST 到另一个页面并获取其内容,同时仍保留我的会话。

VB.net 是否可以在不使用 WebBrowser 控件的情况下实现这一点?

我试过 Chilkat.HTTP 并且它可以工作,但我想使用 .Net 库。

【问题讨论】:

标签: vb.net webclient


【解决方案1】:

创建一个继承自 WebClient 的新类,该类像@Guffa 所说的那样存储 CookieContainer。这是我使用的代码,它可以做到这一点并且还保持引用者活着:

Public Class CookieAwareWebClient
    Inherits WebClient

    Private 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

这是上述代码的 C# 版本:

using System.Net;
class CookieAwareWebClient : WebClient
{
    private CookieContainer cc = new CookieContainer();
    private string lastPage;

    protected override WebRequest GetWebRequest(System.Uri address)
    {
        WebRequest R = base.GetWebRequest(address);
        if (R is HttpWebRequest)
        {
            HttpWebRequest WR = (HttpWebRequest)R;
            WR.CookieContainer = cc;
            if (lastPage != null)
            {
                WR.Referer = lastPage;
            }
        }
        lastPage = address.ToString();
        return R;
    }
}

【讨论】:

  • 会试试这个。谢谢你。它类似于我找到的其他继承,然后重载类。
  • 多年来我一直在使用它并取得了绝对的成功。如果它对您不起作用,那么它不是 cookie/会话问题,但您正在爬取的网站可能正在使用 javascript 来修改表单状态。如果是这种情况,要么检查 javascript,要么只使用数据包监视器或提琴手来查看实际通过网络发送的内容。
  • can ne1 post this in c#, and my problm is also similar,我为此发布了一个问题,但我没有得到相关答案..仍在寻找答案..
  • 难怪微软从一开始就不发布带有cookie感知功能的webclient。
  • 只是想指出,如果您想使用支持 cookie 的 WebClient 类,但又想传入您自己的 cookie(例如来自 HttpWebRequest/Response 会话的现有会话),您可以进一步扩展上面的例子通过添加构造函数。我在这里所做的一个例子: public CookieAwareWebClient() { cc = new CookieContainer(); } public CookieAwareWebClient(CookieCollection cookies) { cc = new CookieContainer(); cc.Add(cookies); }
【解决方案2】:

你不能让 WebClient 类记住 cookie,你必须从响应中获取 cookie 容器并在下一个请求中使用它。

【讨论】:

    猜你喜欢
    • 2019-06-21
    • 2015-09-16
    • 2013-05-14
    • 1970-01-01
    • 2014-06-04
    • 2023-03-03
    • 2014-02-23
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多