【问题标题】:How to manitain session values during HttpWebRequest?如何在 HttpWebRequest 期间维护会话值?
【发布时间】:2013-06-12 12:40:49
【问题描述】:

在我的code 中,我将HttpWebRequest 发送到我网站中的一个页面。

request 发送到这个页面时,它不会维护Session 的值。

下面是我生成网络请求的代码:

Public Overloads Shared Function ReadURL(ByVal sUrl As String) As String
        Dim sBody As String
        Dim oResponse As HttpWebResponse
        Dim oRequest As HttpWebRequest
        Dim oCookies As New CookieContainer
        oRequest = WebRequest.Create("http://localhost:64802/inventory/purchase_order.aspx?id=5654")
        oRequest.CookieContainer = oCookies
        oResponse = oRequest.GetResponse()
        Dim oReader As New StreamReader(oResponse.GetResponseStream())
        sBody = oReader.ReadToEnd
        oReader.Close()
        oResponse.Close()
        Return sBody
    End Function

下面是Purchaseorder.aspx.vb的Page_Load上写的代码:

iDomains_ID = Session("Domains_ID")
        iLogin_ID = Session("Login_ID")
        sPage = Request.Path
        If Request.QueryString.Count > 0 Then sPage &= "?" & Request.QueryString.ToString()
        sPage = shared01.Encrypt(sPage, Application("PK"))

        If Not User.Identity.IsAuthenticated Or iLogin_ID = 0 Then
            Response.Redirect("/login.aspx?page=" & sPage)
            Exit Sub
        End If

code 以上没有获得session 值,它会重定向到login page

那么,我如何在HttpWebRequest 期间维护两个页面上的session

正在寻找您的回复。

编辑

我尝试使用CookieContainer 类,如您在上面的代码中所见。但它根本不起作用。

【问题讨论】:

    标签: asp.net .net session httpwebrequest httpwebresponse


    【解决方案1】:

    或者,假设调用页面和被调用页面在同一个应用程序中,您可以使用the Server.Execute method 来加载页面内容,而无需向站点发出单独的请求:

    Public Overloads Function ReadURL(ByVal sUrl As String) As String
        Using writer As New StringWriter()
           Server.Execute("~/inventory/purchase_order.aspx?id=5654", writer, False)
           Return writer.ToString()
        End Using
    End Function
    

    【讨论】:

    • 感谢它工作正常。 :) 我希望我不会在服务器上造成任何问题。你怎么看?
    • @CodeRider:与向站点发出单独请求相比,此版本不太可能导致问题,因为它只会使用单个 ASP.NET 线程来处理请求。
    • 谢谢理查德。你帮了我很多。我会在服务器上测试后将其标记为答案。
    【解决方案2】:

    如果我对您的理解正确,您正在从您网站的一个页面向另一个页面发出请求,并且您想将当前 HttpRequest 的 cookie 与您的 WebRequest 一起发送?

    在这种情况下,您需要手动将 cookie 复制到 CookieContainer

    For Each key As String In Request.Cookies.AllKeys
       Dim sourceCookie As HttpCookie = Request.Cookies(key)
    
       Dim destCookie As New Cookie(sourceCookie.Name, sourceCookie.Value, sourceCookie.Path, "localhost")
       destCookie.Expires = sourceCookie.Expires
       destCookie.HttpOnly = sourceCookie.HttpOnly
       destCookie.Secure = sourceCookie.Secure
    
       oCookies.Add(destCookie)
    Next
    

    注意:您要么需要将ReadUrl 函数设为非Shared,要么将当前的HttpRequest 作为参数传递。

    您还需要确保调用页面在<%@ Page ... %> 指令中具有EnableSessionState="false",否则您调用的页面将在尝试获取会话锁定时挂起。

    【讨论】:

    • 我只想访问下一页的会话值。是否可以使用cookie container
    • @CodeRider:“不发送”是什么意思?是发出请求但没有发送 cookie,还是有其他问题?
    • 我的意思是说它不再提出请求了。
    • @CodeRider: 网站还在同一个端口上运行吗?该 URL 看起来像是从 Visual Studio 运行该站点。
    • 是的,我正在使用本地主机。在使用您上面发布的代码之前,它正在向另一个页面发出网络请求。但现在它没有向另一个页面发出任何网络请求。
    【解决方案3】:

    您的代码似乎需要发出请求和发布。第一个请求会将您重定向到您的登录页面。第二个将是您发布到登录页面的请求,它将启动会话并(?)将信息存储到会话变量中。该帖子(到登录页面)然后会将您重定向到您想要的页面。

    我在此示例中使用了代码 http://www.codeproject.com/Articles/145122/Fetching-ASP-NET-authenticated-page-with-HTTPWebRe(我对其进行了一些调整)来编写一个应用程序来执行此操作。

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多