2009-07-28 10 views
5

Sono nuovo di ASP classico e ho bisogno di codificare un'applicazione Web in ASP classico perché il cliente vuole che sia in ASP classico. ! :(Oggetti ASP classici nell'oggetto di sessione

ogni modo ecco la mia domanda:

Quando ho un oggetto di una persona chiamata classe:

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 

Fin qui tutto bene ...

On Alla prossima richiesta, provo a leggere la sessione var come:

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 

Qualsiasi idea su ciò che sta andando sarebbe di grande aiuto.

risposta

1

Non dovrebbe essere

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

Non importa poiché gli oggetti in ASP Classic non possono essere serializzati. –

+0

Spiacente ho incasinato nell'esempio –

+0

@Jeffery: ASP e il sessionobject non ha alcun concetto di "serializzazione". – AnthonyWJones

3

non riesco a spiegare il motivo per cui il codice non funziona guarda bene a me.

L'oggetto viene creato in un contesto di script che viene successivamente rimosso dopo il completamento della richiesta. Quindi mentre il nome del tipo è disponibile, la funzione dell'oggetto è interrotta.

Posso dire che non è una buona idea memorizzare oggetti nella Session anche quelli non creati in script.

La maggior parte degli oggetti utilizzati in ASP esiste in una singola discussione. Una volta creato, solo il thread che ha creato l'oggetto può accedere all'oggetto. Per far fronte a ciò una volta che hai memorizzato un oggetto nella sessione ASP, la sessione si affilia con lo specifico thread di lavoro che lo ha creato.

Quando una richiesta successiva per quella sessione arriva, ora deve essere gestita dal thread di lavoro specifico. Se quel thread è occupato a lavorare per qualche altra richiesta, la richiesta di sessione viene accodata, anche se ci sono molti altri thread di lavoro disponibili.

L'effetto complessivo è di danneggiare la scalabilità delle applicazioni in cui il carico di lavoro può essere distribuito in modo non uniforme tra i thread di lavoro.

+0

Ho visto questo. Le prestazioni sono degradate con un numero crescente di oggetti in Session e Application. – ssorrrell

2

Puoi farlo ma devi essere un po 'subdolo. La mia comprensione di ciò è che quando si memorizza un oggetto cotto in casa in Session si conservano tutti i dati ma si perde tutta la funzionalità. Per riguadagnare la funzionalità devi "reidratare" i dati dalla sessione.

Ecco un esempio in JScript per 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(); 

%> 

E 'un metodo molto potente di gestire il salvataggio dello stato nella sessione e può essere facilmente swopped per DB chiamate/XML ecc, se necessario.

Interessante quello che Anthony solleva sui thread, conoscendo la sua profondità di conoscenza sono sicuro sia corretto e qualcosa su cui riflettere ma se si tratta di un piccolo sito che sarà in grado di farla franca, lo abbiamo usato su un sito di medie dimensioni (10.000 visitatori al giorno) per anni senza problemi reali.

0

Vorrei creare un oggetto COM simile alla tua classe Person con VB6. Quindi memorizzalo. Il codice è molto simile.

Il metodo di Pete probabilmente funziona.

-1

io sono troppo pigro per testarlo per voi, ma

Invece di:

set Session("somePerson") = aPerson 

Prova:

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

set di dati di sessione come questo:

set Session.Contents("UserData") = UserData 

e procedi nel seguente modo:

Session.Contents("UserData.UserIsActive")