2009-07-28 22 views
5

Jestem nowy w klasycznej ASP i potrzebuję kodu aplikacji internetowej w klasycznym asp, ponieważ klient chce, aby był w klasycznym asp. ! :(Klasyczne obiekty ASP Store w obiekcie sesji

Anyways tutaj jest moje pytanie:

Kiedy mam obiekt klasy zwanej osobę:

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 

tej pory tak dobrze ...

On następne żądanie, próbuję odczytać sesję 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 

Wszelkie pomysły na temat tego, co się dzieje, będą bardzo pomocne.

Odpowiedz

1

Nie powinno to być

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

Nie ma znaczenia, ponieważ obiektów w ASP Classic nie można serializować. –

+0

Przepraszam, że zawiodłem w przykładzie –

+0

@Jeffery: ASP i obiekt session nie mają pojęcia "serializacji". – AnthonyWJones

3

Nie potrafię wyjaśnić, dlaczego Twój kod nie działa wygląda dobrze do mnie.

Obiekt jest tworzony w kontekście skryptu, który jest następnie usuwany po zakończeniu żądania. Dlatego też, gdy nazwa typu jest dostępna, funkcja obiektu jest zepsuta.

Mogę powiedzieć, że nie jest to dobry pomysł, aby przechowywać obiekty w Sesji, nawet te, które nie zostały utworzone w skrypcie.

Większość obiektów używanych w ASP istnieje w jednym wątku. Po utworzeniu tylko wątek, który utworzył obiekt, może uzyskać dostęp do obiektu. Aby poradzić sobie z tym, gdy już zapisałeś obiekt w sesji, sesja ASP wiąże sesję z określonym wątkiem roboczym, który utworzył obiekt.

Po nadejściu kolejnego żądania dotyczącego tej sesji, musi on teraz być obsługiwany przez określony wątek roboczy. Jeśli ten wątek jest zajęty pracą z innym żądaniem, żądanie sesji jest w kolejce, nawet jeśli istnieje wiele innych dostępnych wątków roboczych.

Ogólnym skutkiem jest uszkodzenie skalowalności aplikacji, gdy obciążenie pracą może zostać nierównomiernie rozmieszczone w wątkach roboczych.

+0

Widziałem to. Wydajność jest degradowana wraz z rosnącą liczbą obiektów w Sesji i Aplikacji. – ssorrrell

2

Możesz to zrobić, ale musisz być trochę podstępny. Moje rozumienie tego polega na tym, że podczas przechowywania obiektu pieczonego w domu, sesja przechowuje wszystkie dane, ale traci całą funkcjonalność. Aby odzyskać funkcjonalność, musisz "nawilżyć" dane z sesji.

Herezje przykład w JScript 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(); 

%> 

Jest to dość skuteczna metoda zarządzania zapisywanie stanu w sesji i mogą być łatwo swopped się nazywa DB/XML itd. W razie potrzeby.

Ciekawe, co Anthony podnosi na temat wątków, znając jego głęboką wiedzę Jestem pewien, że jest poprawne i nie ma co myśleć, ale jeśli jest to mała strona, będziecie mogli się z tym uporać, użyliśmy tego na średniej wielkości witryna (10 000 odwiedzających dziennie) bez lat z prawdziwymi problemami.

0

Chciałbym utworzyć obiekt COM, który wygląda jak twoja klasa Person z VB6. Potem zapamiętaj to. Kod jest bardzo podobny.

Prawdopodobnie metoda Pete'a działa.

-1

jestem leniwy, aby przetestować go dla ciebie, ale

Zamiast:

set Session("somePerson") = aPerson 

Spróbuj:

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

Zestaw danych sesji tak:

set Session.Contents("UserData") = UserData 

, a następnie pobierz to tak:

Powiązane problemy