2009-07-28 31 views
5

Tôi mới sử dụng ASP cổ điển và tôi cần mã hóa ứng dụng web trong asp cổ điển bởi vì khách hàng muốn ứng dụng đó trong asp cổ điển. ! :(Các đối tượng ASP Store cổ điển trong đối tượng phiên

Anyways đây là câu hỏi của tôi:

Khi tôi có một đối tượng của một lớp được gọi là người:

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 

Cho đến nay rất tốt ...

On yêu cầu tiếp theo, tôi cố đọc phiên var như sau:

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 

Bất kỳ ý tưởng nào về những gì đang diễn ra sẽ giúp ích rất nhiều.

Trả lời

1

nên không đó là

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

Không quan trọng vì các đối tượng trong ASP Classic không thể được tuần tự hóa. –

+0

Xin lỗi tôi đã nhầm lẫn trong ví dụ –

+0

@Jeffery: ASP và sessionobject không mang khái niệm "serialization". – AnthonyWJones

3

Tôi không thể giải thích tại sao mã của bạn không hoạt động có vẻ tốt đẹp đối với tôi.

Đối tượng được tạo trong ngữ cảnh tập lệnh sau đó bị rách sau khi yêu cầu hoàn tất. Do đó trong khi tên loại có sẵn, chức năng của đối tượng bị hỏng.

Tôi có thể cho bạn biết không nên lưu trữ các đối tượng trong phiên ngay cả những đối tượng không được tạo trong tập lệnh.

Hầu hết các đối tượng được sử dụng trong ASP tồn tại trong một chuỗi duy nhất. Khi đã tạo chỉ luồng đã tạo đối tượng có thể truy cập đối tượng. Để đối phó với điều này một khi bạn đã lưu trữ một đối tượng trong phiên ASP liên kết phiên với chuỗi công nhân cụ thể đã tạo ra nó đối tượng.

Khi một yêu cầu tiếp theo cho phiên đó đến, nó phải được xử lý bởi chuỗi công nhân cụ thể của nó. Nếu chuỗi đó xảy ra để bận làm việc cho một số yêu cầu khác, yêu cầu phiên được xếp hàng đợi, ngay cả khi có nhiều chuỗi công việc có sẵn khác.

Tác động tổng thể là làm hỏng khả năng mở rộng của ứng dụng, nơi tải công việc có thể phân phối không đều trên các chuỗi công việc.

+0

Tôi đã thấy điều này. Hiệu suất bị suy giảm với số lượng đối tượng ngày càng tăng trong Phiên và Ứng dụng. – ssorrrell

2

Bạn có thể làm điều này nhưng bạn phải có một chút lén lút. Sự hiểu biết của tôi về nó là khi bạn lưu trữ một đối tượng nướng tại nhà trong Session là giữ tất cả dữ liệu nhưng mất tất cả các chức năng. Để lấy lại chức năng, bạn phải "hydrat hóa lại" dữ liệu từ phiên.

Heres một ví dụ trong JScript cho 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(); 

%> 

của một phương pháp khá mạnh mẽ của quản lý nhà nước tiết kiệm vào phiên và có thể dễ dàng được swopped ra cho các cuộc gọi DB/XML vv nếu cần thiết.

Thú vị những gì Anthony đặt ra về chủ đề, biết kiến ​​thức sâu sắc của anh ấy. Tôi chắc chắn nó đúng và một cái gì đó để suy nghĩ, nhưng nếu một trang web nhỏ, bạn sẽ có thể loại bỏ nó trang web có kích thước trung bình (10 nghìn khách truy cập mỗi ngày) trong nhiều năm mà không có vấn đề gì thực sự.

0

Tôi sẽ tạo đối tượng COM trông giống như lớp Person của bạn với VB6. Sau đó lưu trữ đó. Mã này rất giống nhau.

Phương pháp của Pete có thể hoạt động.

-1

tôi để lười biếng để kiểm tra nó cho bạn, nhưng

Thay vì:

set Session("somePerson") = aPerson 

Hãy thử:

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

dữ liệu Set phiên như thế này:

set Session.Contents("UserData") = UserData 

và sau đó nhận được nó như thế này:

Session.Contents("UserData.UserIsActive") 
Các vấn đề liên quan