2009-07-28 5 views
5

Je suis nouveau à ASP classique et j'ai besoin de coder une application web en ASP classique parce que le client veut que ce soit en ASP classique. ! :(Classique ASP Store objets dans l'objet de session

Quoi qu'il en soit, ma question est:

Quand j'ai un objet d'une classe appelée personne:

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 

So far so good ...

sur la prochaine demande, j'essaie de lire la session var comme:

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 

Toutes les idées sur ce qui se passe serait d'une grande aide.

Répondre

1

Ne devrait-il

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

Cela n'a pas d'importance car les objets dans ASP Classic ne peuvent pas être sérialisés. –

+0

Désolé j'ai foiré dans l'exemple –

+0

@Jeffery: ASP et l'objet session ne porte aucun concept de "sérialisation". – AnthonyWJones

3

Je ne peux pas expliquer pourquoi votre code ne fonctionne pas l'air bien pour moi.

L'objet est créé dans un contexte de script qui est ensuite supprimé une fois la requête terminée. Ainsi, alors que le nom du type est disponible, la fonction de l'objet est cassée.

Je peux vous dire que ce n'est pas une bonne idée de stocker des objets dans la session, même ceux qui ne sont pas créés dans le script.

La plupart des objets utilisés dans ASP existent dans un seul thread. Une fois créé, seul le thread qui a créé l'objet peut accéder à l'objet. Pour gérer cela une fois que vous avez stocké un objet dans la session ASP, la session est associée au thread de travail spécifique qui l'a créé. Lorsqu'une requête ultérieure pour cette session arrive, elle doit maintenant être gérée par son thread de travail spécifique. Si ce thread est occupé à travailler pour une autre requête, la requête de session est mise en file d'attente, même s'il y a beaucoup d'autres threads de travail disponibles.

L'effet global est d'endommager l'évolutivité des applications où la charge de travail peut devenir inégalement répartie à travers les threads de travail.

+0

J'ai vu ça. Les performances sont dégradées avec un nombre croissant d'objets dans Session et Application. – ssorrrell

2

Vous pouvez le faire mais vous devez être un peu sournois. Ma compréhension de cela est lorsque vous stockez un objet cuit à la maison dans la session est conserve toutes les données mais perd toutes les fonctionnalités. Pour retrouver la fonctionnalité, vous devez "réhydrater" les données de la session.

Heres un exemple dans JScript pour 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(); 

%> 

Son tout à fait une méthode puissante de gestion de l'état d'économie dans la session et peut facilement être troqué pour DB appels/XML, etc. si nécessaire. Intéressant ce qu'Anthony soulève sur les discussions, connaissant sa profondeur de connaissance, je suis sûr que c'est correct et quelque chose à penser mais si c'est un petit site, vous serez en mesure de s'en tirer, nous l'avons utilisé sur un site de taille moyenne (10K visiteurs par jour) pendant des années sans problèmes réels.

0

Je créer un objet COM qui ressemble à votre classe Person avec VB6. Puis stocker cela. Le code est très similaire.

La méthode de Pete fonctionne probablement.

-1

Je suis paresseux pour le tester pour vous, mais

Au lieu de:

set Session("somePerson") = aPerson 

Essayez:

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

données de session Posé comme ceci:

set Session.Contents("UserData") = UserData 

et puis l'obtenir comme ceci:

Session.Contents("UserData.UserIsActive")