让你的类继承IRequiresSessionState试试

解决方案 »

  1.   

    HttpWebRequest.CookieContainer 属性
      

  2.   

    下面是我前面编的一个登录、保存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
      

  3.   

    to:  Sunmast(速马) 
      我要实现客户端访问的模拟,IRequiresSessionState是服务端编程吧?不行的。;)to: walkinhill(reaway) 
      这是否是需要服务器使用Cookie验证,而不是用Session的情况?
      

  4.   

    呵呵,walkinhill(reaway)是对的
    我说IRequiresSessionState接口其实自己也没试过,只是觉得有可能可以,让你试试 (-:浏览器发送给服务器的只有cookie,而session在cookie里面(包括session id)
    所以你取得HttpWebResponse的cookie后,下次HttpWebRequest时带上这个cookie,就可以了
      

  5.   

    ;)问题已经解决。的确如此。不过稍微不同的是,GetResponse之后,CookieContainner是null,也许是因为我用异步(BeginGetResponse())获取数据的问题。究竟是不是我没有测试了,通过sniffer进行抓包分析得到的结果是,在Headers中,通过“Set-Cookie”可以得到SessionID,以及其他信息。
    下次附加Session信息,是通过CokieContainner进行设置的。3q各位。