如何让WebClient使用Cookies?

Jer*_*emy 18 vb.net webclient

我希望VB.net WebClient能够记住cookie.

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

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

这是否可以使用VB.net而不使用WebBrowser控件?

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

Chr*_*aas 46

创建一个新的类继承自存储CookieContainer的WebClient,如@Guffa所说.这是我使用的代码,它也可以让referer保持活力:

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
Run Code Online (Sandbox Code Playgroud)

这是上面代码的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是想指出,如果你想使用带有cookie支持的WebClient类但希望传入你自己的cookie(比如来自HttpWebRequest/Response会话的现有会话),你可以通过添加构造函数来进一步扩展上面的例子.我在这里做的一个例子:public CookieAwareWebClient(){cc = new CookieContainer(); 公共CookieAwareWebClient(CookieCollection cookies){cc = new CookieContainer(); cc.Add(饼干); } (2认同)

Guf*_*ffa 5

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