2016-12-08 7 views
5

Я использую некоторые WebMethods в System.Web.UI.Page для обработки некоторых ajax-запросов, и я пытаюсь сохранить объект в сеансе сохранять информацию по нескольким запросам ajax и даже после выхода из страницы и возврата.HttpContext.Current.Session в общем методе не сохраняются изменения

Я получаю доступ к сеансу через HttpContext.Current.Session("foo"), и если это ничего, я установил его через 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?

Редактировать: нашел мою проблему, неделю слишком поздно. Линия 1 из .aspx:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="foo.aspx.vb" 
    Inherits="foo" MaintainScrollPositionOnPostback="true" 
    MasterPageFile="~/mstrFoot.master" EnableSessionState="ReadOnly" %> 

страница была создана, чтобы иметь только для чтения сеанса, который переопределяет параметр EnableSession в PageMethod в. [facepalm]

+0

Вы также можете опубликовать объявление функции? похоже, что он должен работать, если вы добавите правильный атрибут: http://stackoverflow.com/questions/4758575/how-can-i-access-session-in-a-webmethod '[WebMethod (EnableSession = true)]' – ps2goat

+0

Это может быть проблема конфигурации? Может быть, проблема с POST vs GET? Когда пользователи регистрируются, мы устанавливаем кучу переменных сеанса, и они сохраняются просто отлично, но я не могу получить изменения в сеансе, чтобы сохранить, если я их сделаю здесь. –

+0

какие версии.net вы работаете, так что я могу более точно проверить это? – ps2goat

ответ

1

IIS по умолчанию будет использовать многоядерный процессор. В многопроцессорной среде параметр InProc SessionState по умолчанию в файле web.config случайным образом обрабатывает запросы на разные потоки (отдельные потоки на процессор/ядро). Более подробно здесь: https://msdn.microsoft.com/en-us/library/ms998549.aspx#scalenetchapt06_topic8

FYI, хотя я также делал это сам в прошлом, сохранение состояния сеанса между запросами веб-API (SOAP/REST) ​​нахмурилось, поскольку оно представляет собой накладные расходы на сервер, которые трудно масштабировать. Сохранение сложных объектов в состоянии сеанса также требует, чтобы каждый аспект этого объекта/свойств/полей тоже был сериализуемым, что может стать очень сложным. Это сказало ...

Основываясь на предоставленной вами информации, вам необходимо настроить веб-приложение для использования режима StateServer. Включить государственную службу ASP.NET на какой-либо машине, чтобы несколько запросов, обрабатываемых отдельными потоками, поддерживали сеанс между процессорами. https://msdn.microsoft.com/en-us/library/ms178586.aspx

+0

SessionState в настоящее время настроен на режим SQLServer, делает ли это то же, что и StateServer? –

+0

Если вы подтвердили, что сеансы остаются на сервере SQL, то да, это выполняет то же, что и StateServer. Вам также может потребоваться выполнить пользовательскую сериализацию для вашего пользовательского объекта. Прочитайте сеанс 'out-of-proc' этой статьи, чтобы убедиться, что ваш пользовательский объект будет сериализован/десериализован правильно: http://www.hanselman.com/blog/TroubleshootingExpiredASPNETSessionStateAndYourOptions.aspx –

1

Если ваш сеанс не синхронизирован, наиболее вероятная причина заключается в том, что ASP.NET генерирует другой идентификатор сеанса между вашими запросами веб-метода и вашими вызовами (aspx?). Вероятно, вы имеете доступ к тому же сеансу (если не время ожидания и файлы cookie) между двумя вызовами веб-методов, но не через вызов страницы и веб-метод.

Cannot get session in webmethod in asp.net

+0

Я могу получить переменные сеанса (например, имя пользователя, адрес электронной почты и т. д.), которые были установлены в другом месте приложения, но все, что я изменяю в WebMethod, не придерживается. –

+0

Где определено определение getSessionTooling? Вы не передаете httpcontext этому методу, скорее всего, не получите правильный httpcontext для запроса. Попробуйте передать контекст в вызов метода. – Vivek

+0

Он определен в моем классе «ToolingModel». Я попытался передать сеанс из WebMethod, но у меня была та же проблема, что и сессия не сохраняла изменений. –