3

当社では、元は ColdFusion + Access でしたが、後にクラシック ASP + MS Sql に変換された、リクエスト システムと呼ばれるタスク/時間追跡用のアプリを使用しています。部門ごとに分類されているため、MIS、マーケティング、ロジスティクスなどに 1 つ存在します。問題は、(主にマネージャー) が一度に複数のブラウザーを使用し、2 つのブラウザー ウィンドウを開いたときに発生します。リクエストシステムはセッション変数を使用しており、多くのセッション変数が使用されており、「セッション」はアプリケーション内で 2300 回参照されています。ご想像のとおり、2 つが同時に開いていると、変数が混ざり合ってあらゆる種類の異常が発生します。

システムには、これを「修正」する 3 年前の MIS 要求があり、3 人の開発者が取り組んできました。他の誰かがこのようなプロジェクトに取り組まなければならなかったのか、問題のいくつかを軽減しようとするハックがあったのかどうか疑問に思っていました. global.asa で何かを呼び出してその他をロードすることを考えていました。クエリ文字列からのセッション変数。問題は、次のようなことが起こっていることです。

If (Session("Application") <> Request("App")) and Request("App") <> "" THEN
  Session("Application") = Request("App")
End If

インクルード ファイル内の関数を見ると、6 つの異なるセッション変数を参照する 4 つのパラメーターを持つ関数があります。ですから、これは苦痛になるでしょう。

過去に誰かがこのようなことをしなければなりませんでしたか? 役に立つハックはありますか?

4

5 に答える 5

2

直接の Session("whatever") インターフェイスからコードをリファクタリングします。

  1. セッション アクセス用の API を作成し、Session の既存の使用をすべてそれで置き換えます (セッションの「クラス/オブジェクト」または単なるインクルード ファイルにすることができます)。
  2. セッション変数に渡された名前を、必要に応じてドメインごとに一意にするもの (部門など) でマングルします。
  3. 慎重にテストする

その後、後ですべてを最新の Web 言語で書き直すか、別の奇跡を実行するように依頼される前に別の仕事を見つけてください;-)

于 2008-11-10T20:45:49.943 に答える
0

「セッション」が参照される回数は、あなたが思っているほど多くのことを意味するわけではありません。また、コーディングエラーがない限り、2つのブラウザを開いておくと、2つの別々のセッションが開始され、それらのセッションの値が「混同」されないようにする必要があります。

両方のセッションが同じCookieから読み取る、またはApp変数の問題など、他の何かに関係しているのではないかと思います。ソース全体を見ずに、言うのは難しいです。あなたを助けるためにコードに精通している誰かがいるかどうかを調べることは価値があるかもしれません。

そして、はい、コードを掘り下げるのは苦痛になりますが、少なくとも、次に何かを修正する必要があるときに、より多くのことを知ることができます。;)

その上、書き直しが常に最良の選択肢であるとは限りません。書き直しでどのような楽しいビジネスロジック/バグ修正が失われるかはわかりません。

于 2008-11-23T15:17:19.187 に答える
0

私はAnonJrに同意します

2 つのブラウザーを開いている Blockquote は、2 つの別個のセッションを開始する必要があります

静的グローバル変数の使用がデータ損失を引き起こしている可能性があります

于 2008-11-23T15:27:36.640 に答える
0

セッションクラス(使用する場合)では、各変数を参照するときに、すべての変数を識別できるようにプレフィックスまたは一般的なものを使用します...その後、すべてのセッション変数をループして、おそらく他のセッション変数を見つけることができます参照/作成...

Private Const PREFIX As String = "MyPrefix_"
Public Shared Property MyVariable() As String
    Get
        Return HttpContext.Current.Session(String.Concat(PREFIX, "MyVariable"))
    End Get
    Set(ByVal value As String)
        HttpContext.Current.Session(String.Concat(PREFIX, "MyVariable")) = value
    End Set
End Property

クラスにないセッション変数を見つけるためのループ

For Each Item As Object In HttpContext.Current.Session.Contents
    If Not Item.ToString.StartsWith(PREFIX) Then

    End If
Next
于 2009-07-03T05:15:21.193 に答える
0

私のマネージャー (コード担当者ではなくビジネス担当者) は、このシステムに夢中になっています。彼はそれを書き直すことを急いでいません。これを書き直した場合、使用される唯一のセッション変数はログイン関連になります。残念ながら、私は正しいことよりも速いことに関心があります:(

于 2008-11-10T20:49:44.083 に答える