Shared方法中的HttpContext.Current.Session不会持久更改

Mar*_*ney 6 vb.net session-state webmethod

我在System.Web.UI.Page中使用一些WebMethod来处理一些ajax请求,我试图在会话中存储一个对象,以便在几个ajax请求之后保留信息,甚至在离开页面并返回之后.

我正在访问会话HttpContext.Current.Session("foo"),如果它没什么,我通过它设置它HttpContext.Current.Session("foo") = New Bar().

我遇到的问题是,在设置之后,下次我按下该方法时它已被重置.我尝试更改在其他地方设置的其他会话变量,它们也会被还原.这告诉我,我正在获取会话状态的副本,而不是我可以更新并导致从请求到请求持久化的引用.我仔细检查EnableSession了WebMethod 的属性是否为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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如何将我的更改应用于持久会话状态,从共享WebMethod访问它?

编辑:发现我的问题,一周来不及..aspx的第1行:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="foo.aspx.vb" 
    Inherits="foo" MaintainScrollPositionOnPostback="true" 
    MasterPageFile="~/mstrFoot.master" EnableSessionState="ReadOnly" %>
Run Code Online (Sandbox Code Playgroud)

该页面设置为只读会话,该会话将覆盖PageMethod的EnableSession设置.[捂脸]

Pau*_*uce 1

默认情况下,IIS 将利用多核 CPU。在多处理器环境中,web.config 中的默认 InProc SessionState 设置会随机处理不同线程上的请求(每个处理器/核心有单独的线程)。更多详细信息请参见:https://msdn.microsoft.com/en-us/library/ms998549.aspx#scalenetchapt06_topic8

仅供参考,虽然我过去也这样做过,但在 Web API (SOAP/REST) 请求之间维护会话状态是不受欢迎的,因为它代表了难以扩展的服务器开销。在会话状态中存储复杂对象还要求该对象/属性/字段的每个方面都可以序列化,这可能会变得非常棘手。那是说...

根据您提供的信息,您需要将 Web 应用程序设置为使用 StateServer 模式并在某些计算机上启用 ASP.NET State Service,以便由单独线程处理的多个请求将维持跨 CPU 的会话。https://msdn.microsoft.com/en-us/library/ms178586.aspx