web-dev-qa-db-ja.com

ASP.NET MVC Cookieの実装

アプリケーションに基本的な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);
}
18
gandil

私の実際の実装(基本バージョン)

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);
        }
    }
}
14
gandil

同じリクエストで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を設定して読み取り、失敗しています(最初に述べたように)

いずれにせよ幸運を!

19
White Dragon

これを試して

HttpCookie cookie = new HttpCookie("Remember_Me");
cookie["userID"] = Userid.ToString();
cookie.Expires = DateTime.Now.AddMonths(3);
Response.Cookies.Add(cookie);
1