4

次のアプローチを使用して、グローバル変数を別のクラス ファイルに保持し、いくつかのバックエンド クラス間で受け渡しできるようにしています。問題は、システムがマルチユーザー環境で使用されている場合に失敗することです。管理者は SharePoint サーバーでセッション状態を有効にする準備ができていないため、「セッション」アプローチを選択できません。

static class Global
{
        private static string id = string.Empty;
        public static string id
        {
            get { return id; }
            set { id = value; }
        }
}

上記のコードから static 宣言を削除すると、マルチユーザー シナリオで正しく機能しますか? サーバー管理者からの助けを求めずに、他にどのようなオプションがありますか?

4

4 に答える 4

7

staticユーザーごとまたはリクエストごとのものには使用しないでください。staticWeb アプリケーションでは非常にまれですが、システム構成全体のスナップショットを保持するなどの目的で使用されることがあります (できれば不変)。

では、どこに物を保管できますか?

session-state は、セッションごとの (そしてここに手がかりがある) ものに対する明らかな答えですが、それはオプションではないようです

それを超えて、あなたは基本的に持っています: http リクエスト。つまり、フォーム、クエリ文字列、および Cookie にアクセスできます。それだけです。Cookie に多くを保存したくない場合: すべてのリクエストが肥大化します。そして、「ビューステート」はただの悪です。通常のセッション状態が実行できない場合は、(適切に保護された) いくつかの Cookie に基づいて自作の「セッション」実装を行うことができますが、率直に言って、次のいずれかを実行することをお勧めします。

  • 必要な場合はリクエストフォーム/クエリ文字列を使用してくださいid
  • それ以外の場合は、管理者にセッション状態を有効にするようにプッシュします
于 2013-02-13T21:09:29.297 に答える
5

静的変数はすべてのユーザー間で共有され、特定のユーザーに属しません。Web 環境で状態を保持するために静的変数を使用することは、ほとんどの場合、悪い考えです。

セッション状態を有効にできない場合は、次の方法をお勧めします。

  • ユーザー固有の識別子を URL に追加し、それを URL に保持します
  • そのIDに基づいて、サーバー上のデータベースに状態を保存します

このようにして、本質的にセッション状態を再発明しています。ただし、セッション状態をグローバルに有効にすることは避けます。状態が十分に小さい場合は、それを URL にエンコードすることもできます。

また、共有サーバーに保存しない限り、サーバー ファーム環境ではセッション状態がうまく機能しないことも考慮してください。これが、管理者がセッション状態を有効にしない理由かもしれません。

于 2013-02-13T21:09:46.420 に答える
2

静的は、SharePoint が十分にサポートする Web ファームまたは Web ガーデン環境ではさらに悪化する可能性があります。静的フィールドはAppDomain ごとです。これは、たとえば、1 つのマシン内の 1 つのワーカー プロセス内のすべてのユーザーに対して同じになることを意味しますが、ワーカー プロセス間およびマシン間では異なります。

マルチユーザー アプリケーションでは静的を使用しないでください。環境が変化しても動作が変化することを心配する必要はありません。

于 2013-02-13T21:49:43.657 に答える
1

セッション状態が必要な場合は、セッション状態を有効にしてください。それはそれと同じくらい簡単です。

ただし、少数の (軽量の) セッション変数だけが必要な場合は、Cookie を使用せずに、リクエストごとにデータをやり取りすることができます。

次のようなものを使用して、セッション状態を「再実装」することもできます。

static class Globals
{
   private static Dictionary<string, MySessionObjectType> sessions;

   public static MySessionObjectType GetSessionData(string SessionID){...}

   public static void SetSessionData
                         (string SessionID, MySessionObjectType sessionData){...}
}

もちろん、これは複数の Web サーバーに拡張することはできず、セッション タイムアウトの管理は PITA になります。

Web 自体の性質はステートレスであることを忘れないでください。そのため、(サーバー上でもクライアント上でも) 過度に多くの状態を使用することは、必ずしも賢明な選択ではありません。

于 2013-02-13T21:17:54.143 に答える