下面是我前面编的一个登录、保存Session Cookie,然后访问其他页面的程序,关键在于使用 HttpWebRequest.CookieContainer 属性Public Class LoginRequest Public CookieHeader As String Sub New() End Sub Public Function Login(ByVal Url As String, ByVal Params As String) Dim strResult As String = getPageByPost(Url, Params) Return strResult End Function Public Function getPageByPost(ByVal url As String, ByVal payload As String) As String Dim result As HttpWebResponse Dim strResult As String = "" Try Dim req As HttpWebRequest Dim RequestStream As Stream Dim ReceiveStream As Stream Dim encode As Encoding Dim sr As StreamReader req = WebRequest.Create(url) req.Method = "POST" req.ContentType = "application/x-www-form-urlencoded" req.CookieContainer = New CookieContainer If Not Me.CookieHeader Is Nothing Then If Me.CookieHeader.Length <> 0 Then req.CookieContainer.SetCookies(New Uri(url), Me.CookieHeader) End If End If Dim SomeBytes() As Byte Dim UrlEncoded As New StringBuilder Dim reserved() As Char = {ChrW(63), ChrW(61), ChrW(38)} If payload <> Nothing Then Dim i As Integer = 0 Dim j As Integer While i < payload.Length j = payload.IndexOfAny(reserved, i) If j = -1 Then UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, payload.Length - i))) Exit While End If UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, j - i))) UrlEncoded.Append(payload.Substring(j, 1)) i = j + 1 End While SomeBytes = System.Text.Encoding.UTF8.GetBytes(UrlEncoded.ToString()) req.ContentLength = SomeBytes.Length RequestStream = req.GetRequestStream() RequestStream.Write(SomeBytes, 0, SomeBytes.Length) RequestStream.Close() Else req.ContentLength = 0 End If result = req.GetResponse() Me.CookieHeader = req.CookieContainer.GetCookieHeader(New Uri(url)) ReceiveStream = result.GetResponseStream() encode = System.Text.Encoding.GetEncoding("utf-8") sr = New StreamReader(ReceiveStream, encode) Dim read(256) As Char Dim count As Integer = sr.Read(read, 0, 256) Do While count > 0 strResult &= New String(read, 0, count) count = sr.Read(read, 0, 256) Loop Catch Exc As Exception Debug.Write(Exc.Message) Finally If Not result Is Nothing Then result.Close() End If End Try Return strResult End Function Public Function getPageByUrl(ByVal url As String) As String Dim result As HttpWebResponse Dim strResult As String = "" Try Dim req As HttpWebRequest Dim ReceiveStream As Stream Dim encode As Encoding Dim sr As StreamReader req = WebRequest.Create(url) req.Method = "GET" req.CookieContainer = New CookieContainer If Not Me.CookieHeader Is Nothing Then If Me.CookieHeader.Length <> 0 Then req.CookieContainer.SetCookies(New Uri(url), Me.CookieHeader) End If End If result = req.GetResponse() Me.CookieHeader = req.CookieContainer.GetCookieHeader(New Uri(url)) ReceiveStream = result.GetResponseStream() encode = System.Text.Encoding.GetEncoding("utf-8") sr = New StreamReader(ReceiveStream, encode) Dim read(256) As Char Dim count As Integer = sr.Read(read, 0, 256) Do While count > 0 strResult &= New String(read, 0, count) count = sr.Read(read, 0, 256) Loop Catch Exc As Exception Finally If Not result Is Nothing Then result.Close() End If End Try Return strResult End Function End Class
to: Sunmast(速马) 我要实现客户端访问的模拟,IRequiresSessionState是服务端编程吧?不行的。;)to: walkinhill(reaway) 这是否是需要服务器使用Cookie验证,而不是用Session的情况?
HttpWebRequest.CookieContainer 属性Public Class LoginRequest
Public CookieHeader As String
Sub New() End Sub
Public Function Login(ByVal Url As String, ByVal Params As String)
Dim strResult As String = getPageByPost(Url, Params)
Return strResult
End Function Public Function getPageByPost(ByVal url As String, ByVal payload As String) As String
Dim result As HttpWebResponse
Dim strResult As String = ""
Try
Dim req As HttpWebRequest
Dim RequestStream As Stream
Dim ReceiveStream As Stream
Dim encode As Encoding
Dim sr As StreamReader req = WebRequest.Create(url)
req.Method = "POST"
req.ContentType = "application/x-www-form-urlencoded"
req.CookieContainer = New CookieContainer If Not Me.CookieHeader Is Nothing Then
If Me.CookieHeader.Length <> 0 Then
req.CookieContainer.SetCookies(New Uri(url), Me.CookieHeader)
End If
End If Dim SomeBytes() As Byte
Dim UrlEncoded As New StringBuilder
Dim reserved() As Char = {ChrW(63), ChrW(61), ChrW(38)} If payload <> Nothing Then
Dim i As Integer = 0
Dim j As Integer
While i < payload.Length
j = payload.IndexOfAny(reserved, i)
If j = -1 Then
UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, payload.Length - i)))
Exit While
End If
UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, j - i)))
UrlEncoded.Append(payload.Substring(j, 1))
i = j + 1
End While
SomeBytes = System.Text.Encoding.UTF8.GetBytes(UrlEncoded.ToString())
req.ContentLength = SomeBytes.Length
RequestStream = req.GetRequestStream()
RequestStream.Write(SomeBytes, 0, SomeBytes.Length)
RequestStream.Close()
Else
req.ContentLength = 0
End If
result = req.GetResponse() Me.CookieHeader = req.CookieContainer.GetCookieHeader(New Uri(url)) ReceiveStream = result.GetResponseStream()
encode = System.Text.Encoding.GetEncoding("utf-8")
sr = New StreamReader(ReceiveStream, encode) Dim read(256) As Char
Dim count As Integer = sr.Read(read, 0, 256) Do While count > 0
strResult &= New String(read, 0, count)
count = sr.Read(read, 0, 256)
Loop Catch Exc As Exception Debug.Write(Exc.Message)
Finally If Not result Is Nothing Then
result.Close()
End If End Try
Return strResult
End Function
Public Function getPageByUrl(ByVal url As String) As String
Dim result As HttpWebResponse
Dim strResult As String = ""
Try
Dim req As HttpWebRequest Dim ReceiveStream As Stream
Dim encode As Encoding
Dim sr As StreamReader req = WebRequest.Create(url) req.Method = "GET" req.CookieContainer = New CookieContainer If Not Me.CookieHeader Is Nothing Then
If Me.CookieHeader.Length <> 0 Then
req.CookieContainer.SetCookies(New Uri(url), Me.CookieHeader)
End If
End If result = req.GetResponse() Me.CookieHeader = req.CookieContainer.GetCookieHeader(New Uri(url)) ReceiveStream = result.GetResponseStream()
encode = System.Text.Encoding.GetEncoding("utf-8")
sr = New StreamReader(ReceiveStream, encode) Dim read(256) As Char
Dim count As Integer = sr.Read(read, 0, 256) Do While count > 0
strResult &= New String(read, 0, count)
count = sr.Read(read, 0, 256)
Loop Catch Exc As Exception
Finally If Not result Is Nothing Then
result.Close()
End If End Try
Return strResult
End Function
End Class
我要实现客户端访问的模拟,IRequiresSessionState是服务端编程吧?不行的。;)to: walkinhill(reaway)
这是否是需要服务器使用Cookie验证,而不是用Session的情况?
我说IRequiresSessionState接口其实自己也没试过,只是觉得有可能可以,让你试试 (-:浏览器发送给服务器的只有cookie,而session在cookie里面(包括session id)
所以你取得HttpWebResponse的cookie后,下次HttpWebRequest时带上这个cookie,就可以了
下次附加Session信息,是通过CokieContainner进行设置的。3q各位。