【发布时间】:2010-05-13 08:39:03
【问题描述】:
我希望 VB.net WebClient 记住 cookie。
我已经搜索并尝试了许多重载类。
我想通过 POST 登录一个网站,然后 POST 到另一个页面并获取其内容,同时仍保留我的会话。
VB.net 是否可以在不使用 WebBrowser 控件的情况下实现这一点?
我试过 Chilkat.HTTP 并且它可以工作,但我想使用 .Net 库。
【问题讨论】:
我希望 VB.net WebClient 记住 cookie。
我已经搜索并尝试了许多重载类。
我想通过 POST 登录一个网站,然后 POST 到另一个页面并获取其内容,同时仍保留我的会话。
VB.net 是否可以在不使用 WebBrowser 控件的情况下实现这一点?
我试过 Chilkat.HTTP 并且它可以工作,但我想使用 .Net 库。
【问题讨论】:
创建一个继承自 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;
}
}
【讨论】:
你不能让 WebClient 类记住 cookie,你必须从响应中获取 cookie 容器并在下一个请求中使用它。
【讨论】: