2009-07-28 3 views
5

Я новичок в классическом ASP, и мне нужно закодировать веб-приложение в классическом asp, потому что клиент хочет, чтобы он был в классическом asp. ! :(Классический объект ASP Store в объекте сеанса

В любом случае вот мой вопрос:

Когда у меня есть объект класса под названием человека:

Class Person 
Private m_sFirstName 

Public Property Get firstName 
firstName = m_sFirstName 
End Property 

Public Property Let firstName(value) 
    m_sFirstName = value 
End Property 

End Class 


set aPerson = new Person 
Person.firstName = "Danny" 

set Session("somePerson") = aPerson 

До сих пор так хорошо ...

На следующий запрос, я пытаюсь прочитать сессию var как:

If IsObject(Session("aPerson")) = true Then 
    set mySessionPerson = Session("aPerson") 

     Response.Write(TypeName(myTest)) // will output "Person" 
     Response.Write(mySessionPerson.firstName) // will output "Object doesn't support this property or method: 'mySessionPerson.firstName' 
End If 

Любые идеи о том, что будет, будут очень полезны.

ответ

1

Если не было бы

If IsObject(Session("somePerson")) = true Then 
    set mySessionPerson = Session("somePerson") 
+0

Не имеет значения, поскольку объекты в ASP Classic не могут быть сериализованы. –

+0

Извините, что я испортил в примере – 2009-07-28 20:35:43

+0

@Jeffery: ASP и sessionobject не имеют понятия о «сериализации». – AnthonyWJones

3

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

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

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

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

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

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

+0

Я видел это. Производительность ухудшается с увеличением количества объектов в сеансе и приложении. – ssorrrell

2

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

Вот пример в 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(); 

%> 

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

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

0

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

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

-1

Я ленив, чтобы проверить это для вас, но

Вместо:

set Session("somePerson") = aPerson 

Try:

Set Session("somePerson") = Server.CreateObject(aPerson) 
0

Набор данных сессии, как это:

set Session.Contents("UserData") = UserData 

, а затем получите следующее:

Session.Contents("UserData.UserIsActive") 
Смежные вопросы