【问题标题】:Failed to retrive session value when called the page using WebRequest.Create(URL)使用 WebRequest.Create(URL) 调用页面时无法检索会话值
【发布时间】:2018-12-15 17:10:59
【问题描述】:

我有一个页面 (email.aspx) 正在检索会话值并根据该值进行一些处理。

当我使用其 URL 直接从浏览器调用 email.ASPX 时,一切正常,没有任何问题。

Public Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim emailaddress As String
        Dim x As String = ""
        x = Session("id")
        If x = "" Then
            emailaddress = "failed to get session"
        Else

            ' Do some staff here
        End If

        Response.Write(emailaddress)


    End Sub

但是当我尝试使用 WebRequest.Create(URL) 从另一个包含嵌入式 vb.net 代码的 ASPX 页面调用 (email.aspx) 时,我发现它无法检索导致错误的 Session 值!

Public Function getemailaddress() As String

        Dim sURL As String
        sURL = "http://sample/email.aspx"

        Dim wrGETURL As System.Net.WebRequest
        wrGETURL = System.Net.WebRequest.Create(sURL)


        Dim emailaddress As String
        Dim objStream As System.Net.HttpWebResponse
        objStream = wrGETURL.GetResponse

        If objStream.StatusCode = System.Net.HttpStatusCode.OK Then
            Dim responseStream As System.IO.StreamReader
            responseStream = New System.IO.StreamReader(objStream.GetResponseStream())
            emailaddress = responseStream.ReadToEnd()
        End If
        objStream.Close()


        Return emailaddress

    End Function

我无法弄清楚这个问题背后的原因

【问题讨论】:

标签: asp.net vb.net session


【解决方案1】:

客户端的会话标识符存储在 cookie 中。 WebRequest 仅在 当前 请求存在期间存储其 cookie,然后将其删除。您需要创建一个“全局”CookieContainer 并将其传递给您发出的网络请求,以便在不同请求之间共享 cookie。

根据您在多少个不同的地方提出请求,您可能希望将其作为参数传递给您的函数:

Public Function getemailaddress(ByVal Cookies As System.Net.CookieContainer) As String

    ...your code...

    'We need to cast wrGETURL to a HttpWebRequest.
    Dim wrGETURL As System.Net.HttpWebRequest
    wrGETURL = DirectCast(System.Net.WebRequest.Create(sURL), HttpWebRequest)

    'Set our cookie container.
    wrGETURL.CookieContainer = Cookies

    ...your code...

End Function

您需要为每个具有相同会话的请求使用相同的CookieContainer,因此在发出所有请求之前在您的代码中声明一个:

Dim Cookies As New System.Net.CookieContainer

MakeRequest1(Cookies) 'Example request.
MakeRequest2(Cookies) 'Example request.

'Make the email request, passing our cookie container to it.
Dim Email As String = getemailaddress(Cookies)

【讨论】:

  • 谢谢@visual vincent,我试过了,但它对我不起作用,当我从另一个函数调用它时,email.aspx 仍然没有检索会话值(存储在服务器端)!
  • @HatemHusam :请用更多代码更新您的问题,显示您的其他请求以及您如何使用 cookie 容器。
  • 这使用 server.excute 解决了我的问题 (stackoverflow.com/questions/17065765/…)。非常感谢
  • @HatemHusam :很高兴您找到了解决方案!请使用帖子下方的close 按钮将您的问题作为重复项关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多