又一个HttpWebRequest的问题。

adailee 2003-12-30 05:59:03
上一个关于HttpWebRequest设置Form数据的问题,大家帮助解决了。现在又有一个难题,请教各位。

使用浏览器(IE)浏览服务端网页asp或者aspx时,服务器可以依据客户端,创建一个Session,并且在网页浏览器(IE)请求的各个页面之间保留这个Session信息。
比如,登陆就是这么做的,Login.aspx验证登陆信息,然后保存到session,以后各个网页都可以用——包括从这个IE新开的窗口,都共有一个Session。

现在的问题是:我用HttpWebRequest请求一个aspx网页,如何让服务器(IIS)为我创建一个Session,并且能在我的应用程序中传递呢?比如说,我先使用HttpWebRequest把用户信息POST到login.aspx,然后我想再去访问data.aspx,注意,不是用IE,而是我自己的程序,是用HttpWebRequest获取data.aspx的内容。结果data.aspx会返回没有登陆的提示信息,也就是Session没有传递。怎么办?

没有资料,我猜想,应该是每个浏览器程序在访问网站时,应该是通过建立一个唯一的标志,并放在HttpWebRequest头部,作为每次请求的标志,服务器(IIS)通过这个来识别的。不知道是不是。

请教各位,如何在多个HttpWebRequest请求时,让服务器保持Session状态。
...全文
84 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
azev 2004-01-06
  • 打赏
  • 举报
回复
fav
adailee 2004-01-04
  • 打赏
  • 举报
回复
;)

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

3q各位。
速马 2003-12-31
  • 打赏
  • 举报
回复
呵呵,walkinhill(reaway)是对的
我说IRequiresSessionState接口其实自己也没试过,只是觉得有可能可以,让你试试 (-:

浏览器发送给服务器的只有cookie,而session在cookie里面(包括session id)
所以你取得HttpWebResponse的cookie后,下次HttpWebRequest时带上这个cookie,就可以了
adailee 2003-12-31
  • 打赏
  • 举报
回复
to: Sunmast(速马)
我要实现客户端访问的模拟,IRequiresSessionState是服务端编程吧?不行的。;)

to: walkinhill(reaway)
这是否是需要服务器使用Cookie验证,而不是用Session的情况?
walkinhill 2003-12-30
  • 打赏
  • 举报
回复
下面是我前面编的一个登录、保存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


walkinhill 2003-12-30
  • 打赏
  • 举报
回复
HttpWebRequest.CookieContainer 属性
速马 2003-12-30
  • 打赏
  • 举报
回复
让你的类继承IRequiresSessionState试试

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧