在AJAX帖子中HttpWebRequest之后会话状态丢失

时间:2011-12-21 10:59:45

标签: asp.net vb.net session jquery httpwebrequest

我在asp.net网络应用程序中有一些奇怪的行为,涉及会话状态丢失。

过程

用户登录应用程序并设置会话。然后,他们填写1个字段,然后应用程序执行AJAX POST.asmx Web服务。在Web服务中,我使用HttpWebRequest从另一台服务器获取数据。

然后将此数据输出到浏览器。

然后填写一些其他字段,然后通过Post将数据再次AJAX POST发送到同一个网络服务。

问题

HttpWebRequest之后,我从会话变量中获取用户名。这有效。 但是,在下一个AJAX请求中,会话不再存在。

在测试时,我删除了调用HttpWebRequest的阶段,我的会话永远不会丢失。因此,出于某种原因,只有在我运行AJAX POST代码时,会话才会在我的第一个AJAX POST之后和第二个HttpWebRequest之前删除。

代码

我在代码中没有做任何花哨的事情。只做一个简单的jQuery AJAX Post

$。AJAX({         url:方法,         数据:params,         类型:“POST”,         contentType:“application / json; charset = utf-8”,dataType:“json”,         成功:函数(数据){                                     //处理数据                                  },         错误:功能(xhr,状态,错误){}    });

创建System.Net.HttpWebRequest,然后从中获取System.Net.HttpWebResponse

然后阅读会话变量dim username as string = Session(_SESSION_USERNAME).ToString()

之前在使用HttpWebRequest之前我从未注意到这种行为(不使用任何AJAX)

Function Backfill(value As String) As Details

    Dim details As Details = Nothing
    Dim appSettings As ConfigSettings.AppConfig = ConfigSettings.AppConfig.getConfig()

    Dim url As String = appSettings.Settings.BackfillUrl
    Dim username As String = appSettings.Settings.BackfillUser
    Dim password As String = appSettings.Settings.BackfillPass

    Dim expParameters As String = ""
    Dim xml As XmlDocument = Nothing
    Dim xmlHttp As XMLHTTP = Nothing
    Dim nodeList As XmlNodeList = Nothing
    Dim node As XmlNode = Nothing
    Dim response As String = ""
    Dim success As String = ""

    '
    ' REMOVED TO HIDE INFO
    expParameters = "<PARAMETERS>" & _            
        "</PARAMETERS>"

    Try

        xmlHttp = New XMLHTTP()
        xmlHttp.open("POST", url)
        xmlHttp.Send(expParameters)

        response = xmlHttp.responseText()

        xml = New XmlDocument
        xml.LoadXml(response)
        SaveExperianFile(xml, value)
        nodeList = xml.DocumentElement.ChildNodes
        node = nodeList.Item(0)
        success = node.Attributes.GetNamedItem("success").Value.ToString.Trim
        If success.ToLower.Trim = "y" Then
            details = SetDetails(xml)
        End If

    Catch ex As Exception
    Finally
        If Not xmlHttp Is Nothing Then
            xmlHttp.Dispose()
            xmlHttp = Nothing
        End If
    End Try

    Return details

End Function

修改

这里可以看到XMLHTTP类代码http://codepaste.net/ymnqsf

修改

当我将XMLDocument保存到我的文件系统时,好像发生了一些奇怪的事情。

Private Sub SaveExperianFile(xml As XmlDocument, value As String)
    Dim appConfig As ConfigSettings.AppConfig = ConfigSettings.AppConfig.getConfig()
    Try
        xml.Save(HttpContext.Current.Server.MapPath(appConfig.Settings.SavePath & value & "_backfill.xml"))
    Catch ex As Exception

    End Try
End Sub

如果我不调用此方法,则会始终设置会话。

问题

你知道造成这种行为的原因吗?

2 个答案:

答案 0 :(得分:3)

您可以检查是否松开会话或重启整个应用程序。如果要将XML保存在虚拟目录/ Web应用程序文件夹中,则可能需要重新启动Web应用程序。如果相继短暂地添加了十几个文件,那么重新启动应用程序池就是一种情况。

答案 1 :(得分:0)

只是预感,但也许你需要在HttpWebRequests中维护cookie。

请查看此问题以获取更多帮助。

Http web request doesn't maintaining session