Классический ASP Хранит объекты в объекте сессии

Это вызывает оценку нескольких операторов, но использует только последний в качестве получающегося значения (rvalue, я думаю).

Так...

int f() { return 7; }
int g() { return 8; }

int x = (printf("assigning x"), f(), g() );

должен привести к x, устанавливаемому на 8.

5
задан AnthonyWJones 29 July 2009 в 21:15
поделиться

4 ответа

Разве это не должно быть

If IsObject(Session("somePerson")) = true Then
    set mySessionPerson = Session("somePerson")
1
ответ дан 14 December 2019 в 08:57
поделиться

Я не могу объяснить, почему ваш код не работает. Мне кажется, что это нормально.

Объект создается в контексте скрипта, который впоследствии удаляется после завершения запроса. Следовательно, пока имя типа доступно, функция объекта нарушена.

Я могу сказать вам, что хранить объекты в сеансе, даже те, которые не созданы в скрипте, - не лучшая идея.

Большинство объектов, используемых в ASP, существуют в одном нить. После создания только поток, создавший объект, может получить доступ к объекту. Чтобы справиться с этим после того, как вы сохранили объект в сеансе, ASP связывает сеанс с конкретным рабочим потоком, который создал этот объект.

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

5
ответ дан 14 December 2019 в 08:57
поделиться

Я бы создал COM-объект, похожий на ваш класс Person с VB6. Тогда сохраните это. Код очень похож.

Метод Пита, вероятно, работает.

0
ответ дан 14 December 2019 в 08:57
поделиться

Вы можете это сделать, но нужно быть немного хитрым. Насколько я понимаю, когда вы храните домашний запеченный объект в Session, он сохраняет все данные, но теряет все функциональные возможности. Чтобы восстановить функциональность, вам нужно «повторно гидратировать» данные из сеанса.

Вот пример в JScript для ASP:

<%@ Language="Javascript" %>
<%

function User( name, age, home_town ) {

    // Properties - All of these are saved in the Session
    this.name = name || "Unknown";
    this.age = age || 0;
    this.home_town = home_town || "Huddersfield";

    // The session we shall store this object in, setting it here
    // means you can only store one User Object per session though
    // but it proves the point
    this.session_key = "MySessionKey";

    // Methods - None of these will be available if you pull it straight out of the session

    // Hydrate the data by sucking it back into this instance of the object
    this.Load = function() {
        var sessionObj = Session( this.session_key );
        this.name = sessionObj.name;
        this.age = sessionObj.age;
        this.home_town = sessionObj.home_town;
    }

    // Stash the object (well its data) back into session
    this.Save = function() {
        Session( this.session_key ) = this;
    },

    this.Render = function() {
        %>
        <ul>
            <li>name: <%= this.name %></li>
            <li>age: <%= this.age %></li>
            <li>home_town: <%= this.home_town %></li>
        </ul>
        <%
    }
}

var me = new User( "Pete", "32", "Huddersfield" );
me.Save();

me.Render();

// Throw it away, its data now only exists in Session
me = null;

// Prove it, we still have access to the data!
Response.Write( "<h1>" + Session( "MySessionKey" ).name + "</h1>" );

// But not its methods/functions
// Session( "MySessionKey" ).Render(); << Would throw an error!

me = new User();
me.Load();  // Load the last saved state for this user

me.Render();

%>

Это довольно мощный метод управления сохранением состояния в сеансе, который легко может быть заменен для вызовов БД / XML и т. д., если необходимо.

Интересно, что Энтони поднимает о потоках, зная его глубину знаний, я уверен, что это правильно и есть над чем подумать, но если это небольшой сайт, вы сможете обойтись без рук. мы использовали это на сайте среднего размера (10 000 посетителей в день) в течение многих лет без каких-либо реальных проблем.

2
ответ дан 14 December 2019 в 08:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: