5

私は従来の ASP を初めて使用し、顧客が従来の ASP での Web アプリケーションを望んでいるため、従来の ASP で Web アプリケーションをコーディングする必要があります。:(

いずれかの方法!ここに私の質問があります:

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

ここまでは順調ですね...

次のリクエストで、セッション変数を次のように読み取ろうとします。

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

何が起こっているかについてのアイデアは非常に役立ちます。

4

6 に答える 6

5

あなたのコードがうまくいかない理由を説明することはできません。

オブジェクトはスクリプトコンテキストで作成され、リクエストの完了後に破棄されます。したがって、型名が使用可能である間、オブジェクトの機能は壊れています。

スクリプトで作成されていないオブジェクトであっても、セッションにオブジェクトを格納することはお勧めできません。

ASPで使用されるほとんどのオブジェクトは、単一のスレッドに存在します。作成されると、オブジェクトを作成したスレッドのみがオブジェクトにアクセスできます。これに対処するために、オブジェクトをセッションに格納した後、ASPは、セッションをオブジェクトを作成した特定のワーカースレッドに関連付けます。

そのセッションに対する後続の要求が到着すると、特定のワーカースレッドによって処理される必要があります。そのスレッドが他のリクエストの処理でビジー状態になっている場合、他に使用可能なワーカースレッドがたくさんある場合でも、セッションリクエストはキューに入れられます。

全体的な影響は、作業負荷がワーカースレッド全体に不均一に分散される可能性があるアプリケーションのスケーラビリティを損なうことです。

于 2009-07-29T16:09:47.650 に答える
2

あなたはこれを行うことができますが、あなたは少し卑劣でなければなりません。私が理解しているのは、ホームベイクされたオブジェクトをSessionに格納すると、すべてのデータが保持されますが、すべての機能が失われるということです。機能を取り戻すには、セッションからデータを「再水和」する必要があります。

JScriptforASPの例を次に示します。

<%@ 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();

%>

セッションへの保存状態を管理する非常に強力な方法であり、必要に応じてDB呼び出し/XMLなどに簡単に切り替えることができます。

アンソニーがスレッドについて提起していることは興味深いです。彼の知識の深さを知っているので、それは正しいと思いますが、小さなサイトであればそれを回避できるのであれば、中規模のサイトでこれを使用しました( 1日1万人の訪問者)何年もの間、実際の問題はありません。

于 2009-07-30T13:33:44.417 に答える
1

そうじゃないかな

If IsObject(Session("somePerson")) = true Then
    set mySessionPerson = Session("somePerson")
于 2009-07-28T20:28:34.377 に答える
0

セッション データを次のように設定します。

set Session.Contents("UserData") = UserData

そして、次のように取得します。

Session.Contents("UserData.UserIsActive")
于 2012-12-30T23:12:33.040 に答える
0

VB6 で Person クラスのような COM オブジェクトを作成します。それからそれを保管してください。コードは非常に似ています。

ピートの方法はおそらくうまくいくでしょう。

于 2009-07-30T13:52:41.103 に答える
-1

私はあなたのためにそれをテストするのが面倒ですが、

それ以外の:

set Session("somePerson") = aPerson

試す:

Set Session("somePerson") = Server.CreateObject(aPerson)
于 2010-12-03T03:17:21.057 に答える