2011-12-21 45 views
14

thể trùng lặp:
Cache v.s SessionWhats sự khác biệt giữa HttpRuntime.Cache và Session?

Tôi đang sử dụng một số mã có sử dụng HttpRuntime.Cache để lưu trữ một giá trị. Tuy nhiên khi tôi đóng cửa sổ bộ nhớ cache biến mất. Có lợi ích gì khi sử dụng phiên này không?

Đây là mã của tôi:

protected dynamic Code() 
{ 
    dynamic code; 

    if (String.IsNullOrEmpty(myHttpContext.Request.QueryString["code"])) 
    { 
     code = HttpRuntime.Cache["code"]; 
    } 
    else 
    { 
     code = myHttpContext.Request.QueryString["code"]; 
     HttpRuntime.Cache.Insert("code", myHttpContext.Request.QueryString["code"]); 
    } 

    return code; 
} 

protected string GetAccessToken(bool regenerate = false) 
{ 
    if (HttpRuntime.Cache["access_token"] == null || regenerate == true) 
    { 
     try 
     { 
      Dictionary<string, string> args = GetOauthTokens(myHttpContext.Request.QueryString["code"]); 
      HttpRuntime.Cache.Insert("access_token", args["access_token"], null, DateTime.Now.AddMinutes(Convert.ToDouble(args["expires"])), TimeSpan.Zero); 
     } 
     catch 
     { 
      OutputError("Code", "Bad Verification Code"); 
     } 
    } 

    return HttpRuntime.Cache["access_token"].ToString(); 
} 

Trả lời

22

HttpRuntime.Cache là toàn cầu để áp dụng; nó được chia sẻ giữa tất cả người dùng/phiên của trang web.

Session là duy nhất cho mỗi phiên người dùng. Những gì một phiên người dùng lưu trữ trong Session là riêng tư cho phiên đó. Một phiên khác sẽ có bộ nhớ riêng.

+0

Xin chào HttpRuntime.Cache ["access_token"] hiển thị với tất cả người dùng? Đây là cách nó được viết trong hướng dẫn, đây sẽ là một lỗ hổng bảo mật rất lớn sau đó! – Darren

+1

Phiên cũng là duy nhất cho mỗi chuỗi công nhân theo http://stackoverflow.com/questions/2151251/asp-net-web-garden-how-many-worker-processes-do-i-need – Jeff

+1

@Jeff. Câu hỏi đó nói rằng với lưu trữ phiên InProc bình thường, 'Session' là duy nhất cho mỗi quy trình * *, không phải cho mỗi luồng * *. Sự khác biệt là rất lớn - ASP.NET luôn luôn sử dụng nhiều chủ đề, nhưng nhiều quá trình chỉ khi cấu hình như vậy. Với nhiều quy trình công nhân, 'Session' có thể được lưu trữ ngoài quá trình có thể. –

4

Có thể lý do bạn thấy bộ nhớ cache bị xóa là bạn đang khởi động lại máy chủ web của mình khi bạn đang chạy lại trang web của mình. Điều này sẽ làm cho nó có vẻ như đối tượng bộ nhớ cache và phiên đã hành xử theo cùng một cách khi trên thực tế chúng rất khác nhau.

Ví dụ: điều này xảy ra khi sử dụng máy chủ web tích hợp của Visual Studio tức là khi chạy trang web dưới dạng ứng dụng web.

Chỉ là một ý nghĩ.

1

Đối tượng bộ nhớ cache chỉ hoạt động trong bộ nhớ và là toàn cầu đối với ứng dụng. Các đối tượng có thể được loại bỏ khỏi Cache bất cứ lúc nào bằng ASP.NET (mặc dù bạn có thể ảnh hưởng đến mức độ nào đó với các đối số cho Cache.Add()). Khi AppPool tái chế hoặc tắt do không hoạt động hoặc nếu bạn khởi động lại ứng dụng của mình (chẳng hạn như bằng cách thay đổi web.config), Cache cũng sẽ bị xóa.

Việc đóng trang web không đủ để xóa Bộ nhớ cache.

Đối tượng phiên là duy nhất cho mỗi phiên người dùng (thường là duy nhất cho mỗi phiên bản trình duyệt). Vào cuối mỗi yêu cầu, có thể được tuần tự hóa và lưu trữ trong SQL Server, hoặc chỉ được lưu trong bộ nhớ (chế độ InProc), hoặc được tuần tự hóa và gửi đến một ứng dụng chuyên biệt có tên là StateServer. Nếu nó được lưu trữ trong bộ nhớ, nó sẽ bị mất trong các điều kiện tương tự như Cache. Nếu nó được ghi vào SQL Server, thì nó sẽ được giữ cho đến khi phiên hết hạn, ngay cả khi AppPool tái chế.

Lưu ý rằng mã trong câu hỏi của bạn nên sử dụng khóa() khi đọc/cập nhật đối tượng Cache. Nếu không, bạn có một điều kiện chủng tộc tiềm năng.

Các vấn đề liên quan