【发布时间】:2017-04-24 02:34:42
【问题描述】:
我在 System.Web.UI.Page 中使用一些 WebMethods 来处理一些 ajax 请求,并且我试图在会话中存储一个对象以跨多个 ajax 请求保留信息,甚至在离开页面后回来了。
我通过HttpContext.Current.Session("foo")访问会话,如果是Nothing,我通过HttpContext.Current.Session("foo") = New Bar()设置它。
我遇到的问题是,在设置后,下次我点击该方法时,它已被重置。我尝试更改在其他地方设置的其他一些会话变量,它们也被还原。这告诉我我正在获取会话状态的副本,而不是我可以更新并导致从请求到请求持续存在的引用。我仔细检查了 WebMethod 的 EnableSession 属性是否为 True,但仍然没有保留对会话状态的更改。
方法声明:
<System.Web.Services.WebMethod(EnableSession:=True)>
Public Shared Function foo(ByVal woNum As String, ByVal workCenter as String) As ToolingModel
Return ToolingModel.getSessionTooling(woNum, workCenter)
End Function
getSessionTooling:
Public Shared Function getSessionTooling(woNum As String, workCenter As String) As ToolingModel
Dim tooling As ToolingModel = HttpContext.Current.Session(TOOLING_MODEL_SESSION_KEY)
If tooling Is Nothing Then
tooling = New ToolingModel(woNum, workCenter)
HttpContext.Current.Session(TOOLING_MODEL_SESSION_KEY) = tooling
ElseIf tooling.woNum <> woNum OrElse tooling.workCenter <> workCenter Then
tooling.woNum = woNum
tooling.workCenter = workCenter
tooling.assets.Clear()
End If
Return tooling
End Function
如何让我的更改应用于持久会话状态,从共享 WebMethod 访问它?
编辑:发现我的问题,一个星期太晚了。 .aspx 的第 1 行:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="foo.aspx.vb"
Inherits="foo" MaintainScrollPositionOnPostback="true"
MasterPageFile="~/mstrFoot.master" EnableSessionState="ReadOnly" %>
页面被设置为只读会话,它会覆盖 PageMethod 的 EnableSession 设置。 [捂脸]
【问题讨论】:
-
你也可以发布函数声明吗?如果添加正确的属性,它看起来应该可以工作:stackoverflow.com/questions/4758575/…
[WebMethod(EnableSession = true)] -
会不会是配置问题?也许 POST 与 GET 有问题?当用户登录时,我们设置了一堆会话变量并且它们保持得很好,但是如果我在这里进行更改,我无法对会话进行更改。
-
您使用的 .net 版本是什么,以便我可以更准确地进行测试?
-
这解决了我的问题
标签: vb.net session-state webmethod