私はクッキーを使います。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();
}