2

私はASP.NETMVC4ソリューションに取り組んでいます。ユーザーがログインするときに、フルネーム(ログインフォームに入力されたユーザー名ではない)を表示したいと思います。彼のフルネーム(データベースのユーザーテーブルに実際に格納されている名+姓)が右上隅に表示されます。

パフォーマンスを向上させるために、リクエストが実行されるたびにデータベースにクエリを実行したくありません。

どうやって進める?

  • ユーザー情報(名、姓、...)をCookieに保持しますか?
  • ユーザー情報を保持することは、アプリケーションのすべてのライフサイクルのセッション変数ですか?
  • ここで説明されているように、ユーザー情報を「プロファイル」に保持する:プロファイル値を割り当てる方法は?(*)
  • 他に何かありますか?

(*)このソリューションは、私が使用するのに少し複雑だと思います。

ありがとう。

4

1 に答える 1

1

私はクッキーを使います。Sessionのようにマシンのメモリを占有することはなく、Profileのようにデータベースにアクセスすることもありません。ユーザーがサインオフするときにCookieを削除することを忘れないでください。

リクエストを行うたびに、プロファイルがデータベースサーバーにヒットすることに注意してください。私の知る限り、プロファイルデータはWebサーバーのどこにもキャッシュされません(カスタムプロファイルプロバイダーがない場合)。

私がCookieを好むもう1つの理由は、UserPrimaryKeyや特別なユーザー設定など、高速アクセスのために追加のユーザー情報を保存したい場合は、それらをJSONとしてCookieに保存することです。次に例を示します。

別の注意:以下のコードはNewtonsoft.Json(JsonConvert行)を使用しています。MVC4プロジェクトではすぐに使用できるはずですが、MVC3プロジェクトの場合は、nugetを使用して追加できます。

public class UserCacheModel
{
    public string FullName { get; set; }
    public string Preference1 { get; set; }
    public int Preference2 { get; set; }
    public bool PreferenceN { get; set; }
}

public static class UserCacheExtensions
{
    private const string CookieName = "UserCache";

    // put the info in a cookie
    public static void UserCache(this HttpResponseBase response, UserCacheModel info)
    {
        // serialize model to json
        var json = JsonConvert.SerializeObject(info);

        // create a cookie
        var cookie = new HttpCookie(CookieName, json)
        {
            // I **think** if you omit this property, it will tell the browser
            // to delete the cookie when the user closes the browser window
            Expires = DateTime.UtcNow.AddDays(60),
        };

        // write the cookie
        response.SetCookie(cookie);
    }

    // get the info from cookie
    public static UserCacheModel UserCache(this HttpRequestBase request)
    {
        // default user cache is empty
        var json = "{}";

        // try to get user cache json from cookie
        var cookie = request.Cookies.Get(CookieName);
        if (cookie != null)
            json = cookie.Value ?? json;

        // deserialize & return the user cache info from json
        var userCache = JsonConvert.DeserializeObject<UserCacheModel>(json);
        return userCache;
    }

}

これにより、次のようなコントローラーからCookie情報を読み書きできます。

// set the info
public ActionResult MyAction()
{
    var fullName = MethodToGetFullName();
    var userCache = new UserCache { FullName = fullName };
    Response.UserCache(userCache);
    return Redirect... // you must redirect to set the cookie
}

// get the info
public ActionResult MyOtherAction()
{
    var userCache = Request.UserCache();
    ViewBag.FullName = userCache.FullName;
    return View();
}
于 2013-02-13T11:50:56.947 に答える