1

私たちは「間違ったことをしている」のでしょうか?

同僚と私は、UniDataサーバー上の診断プログラムからの結果を表示するための「ポータル」として機能するASP.NETページをいじっています。私たちはASP/ASP.NETの奇妙な仕事をしていますが、それは私たちの主要言語ではありません。

このサーバーにアクセスするには、UniDataサーバーを認証および使用するためのAPIであるUniObjectsを使用する必要があります。

Webサイトにアクセスする各ユーザーは、UniDataで認証し、UniObjectsライブラリを介して独自のセッションを取得し、再度サインインせずに使用できるようにする必要がありました(セッションが「x」分以内に使用されない場合を除く)。

私たちが思いついた方法は次のとおりです。

ハッシュテーブル付きのシングルトンがあります。Windowsユーザー名をセッションオブジェクトにマップします。

ユーザーが私たちのページにアクセスし、「username」がハッシュテーブルに存在しない場合、認証が成功すると、セッションオブジェクトが作成され、ハッシュテーブルに追加されるログインページにリダイレクトされます。それ以外の場合は、ハッシュテーブルからユーザーの既存のセッションオブジェクトを取得し、それをリクエストに使用します(有効期限が切れている場合を除きます。有効期限が切れている場合は、削除してログインページにリダイレクトします)。

各セッションオブジェクト(UniObjectsからのもののラッパーオブジェクト)には、「lastUsed」メソッドがあります。UniDataサーバーにログインしているユーザーにはライセンス制限があるため、ユーザーのセッションをクリーンアップする必要があります。そのため、ユーザーがサインインページにリダイレクトされるたびに、「x」分以内にセッションが使用されていないかどうかがチェックされます。その場合、そのセッションを閉じて、ハッシュテーブルから削除します。これはここで行われるため、ユーザーはログイン時にのみ、すべてのリクエストですべてのセッションをチェックすることに関連する遅延を経験しません。


このソリューションはにおいがするという何かが私に言っていますが、私は私たちが何をすべきかを理解するのに十分なASP.NETの経験がありませんか?これを行うためのより良い方法はありますか、それとも実際に大丈夫ですか?

4

3 に答える 3

2

すべてのユーザーが認証されているように見えるので、セッションの状態とタイムアウトを管理する別の方法を使用することを検討することをお勧めします。

あなたが抱えている問題の一部は、ユーザーがログアウトせずにブラウザを閉じた場合、またはアプリケーションの使用を停止した場合、セッションがタイムアウトするまで待ってブラウザを強制終了し、ライセンスの問題のためにUniObjectsを解放する必要があることです。

私の提案は次のとおりです。

  1. 非表示のIFRAMEをMasterPageテンプレートに追加するか、MasterPagesを使用していない場合はサイトの各ページに追加します。
  2. そのMasterPageは、METAリフレッシュを含むKeepAlive.aspxページをロードし、5分ごとにページをリロードします。
  3. セッションタイムアウトを10分(おそらく6分)に減らすことができます

これで、ユーザーがブラウザウィンドウを閉じると、セッションは通常よりもはるかに速くタイムアウトしますが、ブラウザウィンドウを開いたままにすると、セッションは永続的になります。

コード例とウォークスルーはここで見ることができます。

ここで、ユーザーがブラウザウィンドウを一晩中開いたままにして、UniDataライセンスを占有しないようにするための解決策が必要です。この場合、同様の方法を実装します。停滞したページ(つまり、ユーザーが20分間何もしなかった)がログアウトASPXページに更新され、セッションがクリアされます。

于 2010-02-05T06:59:51.467 に答える
2

UniObjectsを使用していると言うとき...COMまたは.NETオブジェクトセットを使用していますか?最も簡単なのは、UniObjectConnecitonプーリングを使用することです。

シングルトンを作成するとき、それをアプリケーションオブジェクト、セッションオブジェクト、またはキャッシュオブジェクトに保存していますか?

Sessionオブジェクトは奇妙なことをする可能性があるので、Applicationオブジェクトをお勧めします。タイムアウトを処理およびチェックする1つの方法は、CacheRemoveCallbackでキャッシュキーを使用することです。このように、ファイル/パスモニターの依存関係を使用して、Windowsファイルの変更を監視し、手動で削除したり、キャッシュの依存関係からタイムアウトしたりすることができます。

これに戻ると、キャッシュの依存関係のタイムアウトはページアクティビティによってのみ引き起こされ、asp.netセッションがリサイクルされると、キャッシュの依存関係が破壊される可能性があります。

ネイサン学長

于 2010-02-05T18:20:02.183 に答える
2

UniObjects COMを使用している場合は、COMマーシャリングが正しく機能していることを確認してください。を見てみましょう:

SafeCOMWrapper-レイトバウンドCOMへの管理された使い捨ての強い型の安全ラッパー http://www.codeproject.com/KB/COM/safecomwrapper.aspx

もう1つの注意点は、UniObjects COMの動的配列クラスに、.NETではうまく機能しないスレッドの問題があることです。可能であれば、UniObjects COMの動的配列クラスの代わりに、.NETで独自の動的配列クラスまたは配列分割を使用してください。

クラスからデータにアクセスしようとすると、空の文字列が表示されることがありますが、デバッグすると、データはそこにあります。これの根本的な原因はわかりません。

.NETで動作する汎用動的配列クラスが必要な場合は、提供できます。

UniObjects.NETには、私の知る限りこれらの問題はありません。

ネイサン学長

于 2010-02-10T17:45:31.837 に答える