2011-07-23 35 views
18

Tôi cố gắng triển khai trình trợ giúp cookie cơ bản trong ứng dụng của mình. Chủ yếu là tôi kiểm tra trong bộ điều khiển cơ sở mọi lúc có hay không nếu cookie được thiết lập. Nếu cookieASP.NET MVC Cookie Implementation

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; 
    } 
} 

nếu phiên là null tôi cố gắng để có được từ cookie hoặc nếu phiên khởi tôi thiết lập cookie nhưng tôi không bao giờ thấy cookie của tôi trong trình duyệt. Chuyện gì thế?

Tôi luôn luôn bắt đầu phiên nhưng với userId = 0 Để có được cookie và thiết lập phiên từ cookie:

if (userId == 0) 
{ 
    MyCookie myCookie = new MyCookie(_app); 
    User user = cookieHelper.GetCookie(); 
    if (user != null) 
     SessionHelper.SetSession(user); 
} 
+5

Mã của bạn này có vẻ tốt để tôi. Bạn có thể đăng mã nơi bạn đang gọi nó không? –

+4

Đoạn mã mới ('if (userId == 0)') nằm ở đâu? Bạn đã đặt mã đó ở đâu? Điều gì phương pháp điều khiển, vv? Ngoài ra, tại sao bạn sử dụng 'CookieHelper' bên dưới và' MyCookie' ở trên? Và tại sao một phương thức 'GetCookie' trả về' HttpCookie' khi bạn gọi phương thức 'GetCookie' khác, nó trả về' User'. Tôi khá bối rối. –

+2

Tôi luôn khởi động phiên trong bộ điều khiển cơ sở. Nếu không có người dùng đăng nhập tôi đặt phiên với id người dùng 0. Actuallu cả hai đều là MyCookie. Nhưng vì tôi chỉnh sửa câu hỏi trong khi mã của tôi bị thay đổi. Bởi vì tôi thử một cái gì đó trong khi chờ đợi một câu trả lời từ stackoverflow. – gandil

Trả lời

14

Thực hiện công tác của tôi (Version Basic)

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

nếu phiên/Cookie là null (thực 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); 
     } 
    } 
} 
19

Bạn không thể đặt và nhận được một cookie trong yêu cầu tương tự. Nhận cookie nhận được từ trình duyệt và chưa nhận được - Đặt cookie sẽ được gửi trở lại như một phần của tiêu đề khi yêu cầu đã hoàn tất.

Bạn cần đặt cookie và làm cho trình duyệt có thể chuyển hướng đến một nơi khác (ví dụ: từ/đăng nhập vào/tài khoản), sau đó yêu cầu đọc mới sẽ hiển thị cookie chính xác.

EDIT: Trong trường hợp đó là sai, tôi cũng sẽ hỏi bạn đang thực sự gọi ở đâu .SetCookie() như không có mã bạn cung cấp là bạn thực sự gọi nó để tạo cookie ngay từ đầu.

Để gỡ lỗi những điều này, tôi thấy nó tốt để lấy bit của mã bạn giả định nên làm việc, kiểm tra chúng. Ví dụ: trong page_load của một trang mới, tôi đã nhập:

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); 

Và cookie xuất hiện chính xác mà không có sự cố. Vì vậy, biết mã này thực sự hoạt động, chúng tôi có thể giả định lỗi là chức năng không được gọi hoặc thử nghiệm/gỡ lỗi bạn đang thực hiện đang cố gắng đặt và đọc cookie trong cùng một yêu cầu và không thành công (như tôi đã nêu)

Dù bằng cách nào may mắn!

+1

Đồng ý! Bạn chỉ có thể đọc cookie khi Trình duyệt đã SENT BACK yêu cầu. Tôi đã từng là nạn nhân của vấn đề như vậy ... nhưng tôi đã tìm ra trong một phút :) .. Tôi đến từ trường PHP năm 1999 :) – effkay

1

Hãy thử

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