我是经典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
任何关于将要发生的事情的想法都会有很大的帮助。
答案 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)