我在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
如果我不调用此方法,则会始终设置会话。
问题
你知道造成这种行为的原因吗?
答案 0 :(得分:3)
您可以检查是否松开会话或重启整个应用程序。如果要将XML保存在虚拟目录/ Web应用程序文件夹中,则可能需要重新启动Web应用程序。如果相继短暂地添加了十几个文件,那么重新启动应用程序池就是一种情况。
答案 1 :(得分:0)