2010-05-13 94 views
18

我想VB.net WebClient记住cookies。如何让WebClient使用Cookie?

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

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

这可能与VB.net不使用WebBrowser控件?

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

回答

44

创建一个从WebClient继承的新类,该WebClient存储CookieContainer,如@Guffa所述。下面是我用的,做的代码,也保留引荐活着:

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; 
    } 
} 
+0

会试试这个。谢谢。它类似于其他的继承,然后重载类找到了。 – Jeremy 2010-05-14 10:05:58

+0

我一直使用这个多年来绝对成功。如果它不适合你,那么它不是一个cookie /会话问题,但可能是你正在蜘蛛网站使用JavaScript来修改表单状态。如果是这种情况,请检查javascript或仅使用数据包监视器或提琴手来查看实际上通过线路发送的内容。 – 2010-05-14 12:48:17

+0

可以ne1发布这在C#中,我的问题也类似,我发布了一个问题,但我没有得到ne相关的答案..仍然搜索答案.. – FosterZ 2010-12-16 14:18:53

4

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

+0

感谢您的建议。 – Jeremy 2010-05-14 10:05:31