会话对象中的经典ASP Store对象

时间:2009-07-28 20:26:40

标签: session asp-classic object-persistence

我是经典ASP的新手,我需要在经典asp中编写Web应用程序代码,因为客户希望它是经典的asp。 :(

反正!这是我的问题:

当我有一个名为person的类的对象时:

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

任何关于将要发生的事情的想法都会有很大的帮助。

6 个答案:

答案 0 :(得分:4)

我无法解释为什么你的代码不起作用对我来说很好。

该对象是在脚本上下文中创建的,随后在请求完成后将其拆除。因此,虽然类型名称可用,但对象的功能已被破坏。

我可以告诉你,在Session中存储对象并不是一个好主意,即使是那些不是用脚本创建的对象。

ASP中使用的大多数对象都存在于一个线程中。一旦创建,只有创建该对象的线程可以访问该对象。为了解决这个问题,一旦你在会话中存储了一个对象,就会将会话与创建它的特定工作者线程关联起来。

当该会话的后续请求到达时,它现在必须由其特定的工作线程处理。如果该线程正忙于处理某些其他请求,则会话请求将排队,即使存在大量其他可用的工作线程。

整体效果是破坏应用程序可伸缩性,其中工作负载可能在工作线程中分布不均。

答案 1 :(得分:2)

你可以这样做,但你必须有点鬼鬼祟祟。我对它的理解是,当你在Session中存储一个家庭烘焙对象时,它会保留所有数据,但会丢失所有功能。要重新获得功能,您必须“重新补充”会话中的数据。

以下是JScript for 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();

%>

它是一种非常强大的方法,可以将保存状态管理到Session中,如果需要,可以很容易地将其转换为DB调用/ XML等。

有趣的是安东尼提出的关于线程的知识,知道他的知识深度我确定它是正确的并且需要思考但是如果它是一个小网站你将能够逃脱它,我们在媒体上使用它大小的网站(每天10万访客)多年没有真正的问题。

答案 2 :(得分:1)

不应该是

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

答案 3 :(得分:0)

我会用VB6创建一个看起来像Person类的COM对象。然后存储。代码非常相似。

Pete的方法可能有效。

答案 4 :(得分:0)

设置如下的会话数据:

set Session.Contents("UserData") = UserData

然后像这样:

Session.Contents("UserData.UserIsActive")

答案 5 :(得分:-1)

我懒得为你测试,但是

而不是:

set Session("somePerson") = aPerson

尝试:

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