2

ユーザーが自分の Web サイトにサインインするときに、メール、確認ステータス、モバイル確認ステータスなどのデータをキャッシュする必要があります。ページ リクエストごとにこのデータを取得したくないからです。要件は、ユーザーが何かを行う前に電子メールとモバイルを確認する必要があることです。
私は次のようなコードを使用しています:

public static class CachedData
{
    public static bool IsEmailConfirmed
    {
        get
        {
            if (HttpContext.Current.Session["IsEmailConfirmed"] == null)
                Initialize();
            return Convert.ToBoolean(HttpContext.Current.Session["IsEmailConfirmed"]);
        }
        set
        {
            HttpContext.Current.Session["IsEmailConfirmed"] = value;
        }
    }

    public static bool IsMobileConfirmed
    {
        get
        {
            if (HttpContext.Current.Session["IsMobileConfirmed"] == null)
                Initialize();
            return Convert.ToBoolean(HttpContext.Current.Session["IsMobileConfirmed"]);
        }
        set
        {
            HttpContext.Current.Session["IsMobileConfirmed"] = value;
        }
    }

    public static void Initialize()
    {
        UserAccount currentUser = UserAccount.GetUser();
        if (currentUser == null)
            return;

        IsEmailConfirmed = currentUser.EmailConfirmed;
        IsMobileConfirmed = currentUser.MobileConfirmed;   
    }
}

すべてPageBaseのページクラスがそこから駆動するクラスがあります。CachedDataクラスでクラスを使用していますPageBase

public class PageBase : Page
{
    protected override void OnInit(EventArgs e)
    {
        if (authentication.Required && User.Identity.IsAuthenticated && !IsPostBack)
        {
            if (CachedData.HasProfile && (!CachedData.IsEmailConfirmed || !CachedData.IsMobileConfirmed) && !Request.Url.AbsolutePath.ToLower().EndsWith("settings.aspx"))
                Response.Redirect("/settings-page", true);
        }
    }
}

おかしなことかもしれませんが、このコードは時々間違って動作し、ユーザーが確認したメールとモバイルの設定ページにリダイレクトされます。
より良い解決策はありますか。

4

2 に答える 2

1

これがあなたのロジックなら、 object を作成する必要があると思いますUserInfo。このようなもの:

public class UserInfo
{
    public string Name {get; set; }
    public bool IsEmailConfirmed {get; set; }
    public bool IsMobileConfirmed {get; set; }
    ....
} 

次に、このオブジェクトをセッションに設定します。今!ユーザー レコードに対する操作が BLL で実行される場合は、新しいインスタンスを再設定UserInfoし、セッション内の古いインスタンスを置き換える必要があります。このようにして、ユーザー情報は最新の状態になり、常に機能します。

しかし、Web ファームを使用していて、セッションが同期されていないことが問題の原因である可能性があります。一意のユーザーからの各リクエストが同じサーバーで処理されるように、スティッキー セッションを使用する必要があります。現在、 というものがありApp Fabricます。ステロイドでキャッシングしています。別のサーバーのキャッシュでアイテムを見つけることができます。

于 2013-10-07T01:28:51.473 に答える
0

オブジェクトの異なるフィールドを異なるセッション名に保存しないでください。セッションを使用する必要がある場合は、ユーザー オブジェクト全体をセッションに保存できます。

データを保存する場所の選択は、要件 (データがどれほど重要であるか、IIS のリセットなどの要件を含む) と、実際に保存する必要があるものとその理由によって異なります。回答に応じて、データをセッション、ビューステート、キャッシュ、またはアプリケーションに保存できます。自動更新、トリガーなどの優れた機能を提供するため、キャッシュを確認することもできます。

于 2013-10-08T13:47:35.497 に答える