19

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

3 に答える 3

19

同じリクエストで 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 は問題なく正しく表示されました。したがって、このコードが実際に機能することを知っていると、関数が呼び出されていないか、現在行っているテスト/デバッグが同じリクエストで Cookie を設定して読み取ろうとして失敗したことがエラーであると想定できます (最初に述べたように)。

いずれにせよ頑張ってください!

于 2011-07-25T01:20:42.157 に答える
14

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

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);
        }
    }
}
于 2011-07-29T20:15:14.787 に答える