3

ASP.NET MVC3 で Web サイトを構築しています。ユーザーがサインインすると、データベースから表示名を取得し、セッション変数に保存します。

Session["DisplayName"] = user.Display;

次に、_Layout.cshtmlそれを使用して各ページの上部に表示します。

<span class="user">@(Session["DisplayName"] as string)</span>

これは、Web サイトのデバッグを開始してからログインすると正常に機能しますが、サーバーを再構築して再度デバッグを開始すると、ブラウザーはログインしたままですが、Session変数はクリアされます。これにより、表示名が必要な場所に空のスペースがたくさんできます。

これはサーバーの再構築の副作用であり、展開時に心配する必要はありませんか? この問題を回避するために、再構築するたびにログインを無効にする方法はありますか? Sessionまたは、変数以外にこのユーザーデータを保存するより良い方法はありますか?

4

3 に答える 3

4

これはサーバーの再構築の副作用であり、展開時に心配する必要はありませんか?

いや、それは絶対に気にしなければならないことです。ご存知のように、ASP.NET セッションはデフォルトでサーバー メモリに保存されます。また、IIS によって AppDomain がリサイクルされると (これはいつでも発生する可能性があります)、すべてのセッションが失われます。たとえば、IIS は、アプリケーションで特定の非アクティブ状態が続くと、AppDomain をダウンさせる可能性があります。または、特定の CPU またはメモリ使用量のしきい値に達した後。ASP.NET セッションで何かを確実に保存できるようにしたい場合は、ストレージをオフプロセスでオフロードし、このセッションを専用のセッション サーバーまたは SQL に保存できます。しかし正直なところ、多くの人が ASP.NET セッションを SQL Server に移行して後悔しているのを見てきました。ポイントは何ですか?この情報は SQL Server に既にあります :-) 私はかつてこれを使用しましたが、とても後悔しました。

個人的には、アプリケーションで ASP.NET セッションを使用したことはありません。表示名などの情報を保持し、各リクエストでデータベースにアクセスすることを避ける必要がある場合は、フォーム認証 Cookie のユーザー データ セクションに保存できます。ユーザーが正しい資格情報を正常に入力したら、手動でFormsAuthenticationTicketUserData プロパティを作成し、各要求でこの使用に関して利用できるようにしたい情報を入力してから、認証 Cookie を発行します。次に、Cookie を復号化するカスタムの Authorize 属性を記述し、ユーザー データを取得してカスタムとして保存し、IIdentity各リクエストで利用できるようにします。

于 2012-06-18T20:10:05.707 に答える
1

ユーザー名をキャッシュ(Cache[string.Format("DisplayName_{0}", User.Id)] = User.Username)、Cookie に保存するか、セッションを InProc ではなく SQL Server に移動します

ユーザー ID でユーザー名を取得する静的ヘルパー メソッドを作成します。キャッシュされた値が見つかった場合はそれを使用し、そうでない場合は db から値を取得し、キャッシュに格納して返します。

public static string GetUsername(int UserID)
{
    string cacheKey=string.Format("DisplayName_{0}", UserID);
    if (HttpContext.Current.Cache[cacheKey]==null)
    {
        // Retrieve user name from DB
        string Username=Repository.GetUserName(UserID);
        HttpContext.Current.Cache[cacheKey]=Username;
    }

    return HttpContext.Current.Cache[cacheKey].ToString();
} 
于 2012-06-18T20:12:25.663 に答える
0

より良い方法がありますが、特定の問題に対処するには、認証タイムアウトとセッション タイムアウトが同じではありません。特に、一方が他方より先にタイムアウトする場合にケースを処理する必要があります。ここで私の投稿を参照してください:

ASP.NET でフォーム認証のタイムアウト例外を処理するにはどうすればよいですか?

于 2012-06-18T20:30:01.887 に答える