アプリケーションに基本的なCookieヘルパーを実装しようとしています。主に、Cookieが設定されているかどうかをベースコントローラーでチェックインします。クッキーの場合
public class MyCookie
{
public static string CookieName {get;set;}
public virtual User User { get; set; }
public virtual Application App { get; set; }
public MyCookie(Application app)
{
CookieName = "MyCookie" + app;
App = app;
}
public void SetCookie(User user)
{
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName);
myCookie.Values["UserId"] = user.UserId.ToString();
myCookie.Values["LastVisit"] = DateTime.Now.ToString();
myCookie.Expires = DateTime.Now.AddDays(365);
HttpContext.Current.Response.Cookies.Add(myCookie);
}
public HttpCookie GetCookie()
{
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName];
if(myCookie != null)
{
int userId = Convert.ToInt32(myCookie.Values["UserId"]);
User user = session.Get<User>(userId);
return user;
}
return null;
}
}
セッションがnullの場合、Cookieから取得しようとするか、セッションの初期化でCookieを設定しますが、ブラウザにCookieが表示されません。なにが問題ですか?
常にセッションを開始しますが、userId = 0でCookieを取得し、Cookieからセッションを設定するには:
if (userId == 0)
{
MyCookie myCookie = new MyCookie(_app);
User user = cookieHelper.GetCookie();
if (user != null)
SessionHelper.SetSession(user);
}
私の実際の実装(基本バージョン)
public class CookieHelper
{
public static string CookieName {get;set;}
public virtual Application App { get; set; }
public MyCookie(Application app)
{
CookieName = "MyCookie" + app;
}
public static void SetCookie(User user, Community community, int cookieExpireDate = 30)
{
HttpCookie myCookie= new HttpCookie(CookieName);
myCookie["UserId"] = user.UserId.ToString();
myCookie.Expires = DateTime.Now.AddDays(cookieExpireDate);
HttpContext.Current.Response.Cookies.Add(myCookie);
}
}
セッション/ Cookieがnull(実際にはuserid = 0)の場合
if (userId == 0){
CookieHelper myCookie = new Cookie(_app);
if (myCookie != null)
{
userId = Convert.ToInt32(System.Web.HttpContext.Current.Request.Cookies[myCookie.CookieName]["userId"]);
if(userId>0)
{
SessionHelper.SetSession(userId);
}
}
}
同じリクエストでCookieを設定して取得することはできません。 Cookieを取得してもブラウザから取得されますが、まだ取得されていません-Cookieを設定すると、リクエストの完了時にヘッダーの一部として送り返されるようになります。
Cookieを設定し、ブラウザに別の場所(たとえば、/ loginから/ account)にリダイレクトするように設定する必要があります。そうすると、新しい要求を読み取ると、Cookieが正しく表示されます。
編集:推測が間違っていた場合、あなたが実際にどこで.SetCookie()を呼び出しているのかを質問します。あなたが提供したコードのどこにも実際にそれを呼び出して最初にCookieを作成するのではないからです.
これらのことをデバッグするには、動作するはずのコードを少し取ってテストするのが良いと思います。たとえば、新しいページのpage_loadに次のように入力しました。
string CookieName = "bob";
long UserId = 4;
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName);
myCookie.Values["UserId"] = UserId.ToString();
myCookie.Values["LastVisit"] = DateTime.Now.ToString();
myCookie.Expires = DateTime.Now.AddDays(365);
HttpContext.Current.Response.Cookies.Add(myCookie);
そして、クッキーは問題なく正しく表示されました。このコードが実際に機能することを知っているので、エラーは関数が呼び出されていないか、現在実行中のテスト/デバッグが同じリクエストでCookieを設定して読み取り、失敗しています(最初に述べたように)
いずれにせよ幸運を!
これを試して
HttpCookie cookie = new HttpCookie("Remember_Me");
cookie["userID"] = Userid.ToString();
cookie.Expires = DateTime.Now.AddMonths(3);
Response.Cookies.Add(cookie);