2013-02-06 32 views
24

Cho đến nay tôi đã sử dụng Phiên để chuyển một số biến từ trang này sang trang khác. Ví dụ như vai trò người dùng. Khi người dùng đăng nhập vào ứng dụng web, id vai trò của người dùng được giữ trong phiên và vai trò đó được kiểm tra ở các phần khác nhau của ứng dụng. Gần đây tôi đã bắt đầu suy nghĩ tại sao không sử dụng các thành viên tĩnh. Tôi có thể lưu trữ cùng một thông tin trong một trường tĩnh và dễ dàng truy cập thông tin đó ở bất kỳ nơi nào trong ứng dụng của tôi (cũng ở bất kỳ đâu trong không gian tên trong đó trường tĩnh nằm trong đó.) Tôi biết rằng việc sử dụng các biến Session thỉnh thoảng có ích, chẳng hạn như:Trường tĩnh và Biến số

  1. Bất kỳ loại dữ liệu nào cũng có thể được lưu trữ trong Phiên. Sau đó nó phải được đúc tuy nhiên. Nhưng các trường tĩnh chấp nhận dữ liệu với kiểu dữ liệu chính xác mà thôi.
  2. Biến phiên sẽ hết hạn sau một thời gian nhất định là hành vi mà chúng tôi cần trong nhiều trường hợp.

Ngoài những điều trên, còn có lý do nào khác khiến tôi không nên sử dụng các trường tĩnh để lưu trữ dữ liệu và có sẵn ở mọi nơi không?

+0

Hi, bạn có thể tham khảo http: // stackoverflow .com/questions/1563171/asp-net-c-sharp-static-variables-là toàn cầu –

+2

không bao giờ sử dụng trường tĩnh cho dữ liệu liên quan đến người dùng. Chúng chỉ nên được sử dụng khi bạn phải duy trì một cái gì đó liên quan đến Ứng dụng rộng –

Trả lời

31

Không, sử dụng các biến tĩnh cho điều này là không con đường để đi:

  • Nếu AppDomain của bạn được tái chế, tất cả các biến tĩnh của bạn sẽ là "thiết lập lại"
  • biến tĩnh không mở rộng theo chiều ngang - nếu bạn tải cân bằng ứng dụng của mình, người dùng truy cập vào một máy chủ thì một người dùng khác sẽ không thấy lưu trữ dữ liệu trong biến tĩnh trong máy chủ đầu tiên
  • Quan trọng nhất, biến tĩnh sẽ được chia sẻ bởi tất cả truy cập vào đó se rver ... nó sẽ không được trên một cơ sở cho mỗi người dùng ở tất cả ... trong khi từ mô tả của bạn, bạn sẽ không muốn người dùng X để xem thông tin của người dùng Y.

Về cơ bản, bạn có hai lựa chọn cho tuyên truyền thông tin xung quanh ứng dụng của bạn:

  • Giữ nó client-side, vì vậy mỗi yêu cầu cung cấp cho các thông tin từ các bước trước. (Điều này có thể trở nên khó sử dụng với số lượng lớn thông tin, nhưng có thể hữu ích cho các trường hợp đơn giản.)
  • Giữ nguyên phía máy chủ, lý tưởng ở một số cách liên tục (ví dụ như cơ sở dữ liệu) với khách hàng cung cấp số nhận dạng phiên.

Nếu bạn có thể sử dụng cân bằng tải để giữ tất cả người dùng đi đến cùng một máy chủ, và nếu bạn không nhớ phiên bị mất khi AppDomain được tái chế hoặc một máy chủ đi xuống , bạn có thể giữ nó trong bộ nhớ, được khóa bằng ID phiên ... nhưng hãy cẩn thận.


Có thể có cơ chế trong ASP.NET để tồn tại này, tuyên truyền thông tin phiên làm việc từ một AppDomain khác - Tôi không chắc chắn

+1

Bây giờ tôi nhận ra rằng tôi phải thực hiện rất nhiều sửa đổi đối với mã của mình vì tôi đã sử dụng các trường tĩnh ở những nơi khác nhau. Cảm ơn bạn Jon đã giải thích rộng rãi. –

9

Chúng là hai điều rất khác nhau.

  • phiên có thể được sử dụng ra khỏi quá trình (quan trọng để cân bằng tải)
  • phiên có thể được bền hơn vì hiện của khả năng xử lý.
  • ASP.Net tự động quản lý đồng thời Phiên.
  • Truy cập vào các biến tĩnh cần phải được đồng bộ hóa theo cách thủ công.
  • Tĩnh là toàn cầu cho toàn bộ miền ứng dụng. Nếu bạn đặt giá trị của trường/thuộc tính tĩnh cho một người dùng, tất cả người dùng sẽ nhận được cùng một giá trị. Không phải là hành vi mong muốn trong kịch bản của bạn.

Mọi loại dữ liệu đều có thể được lưu trữ trong Phiên. Sau đó nó phải được đúc tuy nhiên.Nhưng trường tĩnh chấp nhận dữ liệu với kiểu dữ liệu chính xác chỉ.

Thường hữu ích khi trừu tượng các giá trị Phiên với lớp trợ giúp. Điều này có thể cải thiện khả năng kiểm tra và cũng cho phép bạn mạnh mẽ loại tài sản và thực hiện các diễn viên trong nội bộ của lớp.

Ví dụ:

public List<int> UserRoles 
{ 
    get 
    { 
     // optionally check that the value is indeed in session, otherwise this 
     // will throw 
     return (List<int>)Session["UserRoles"]; 
    } 
} 

Xem thêm:

+3

Bạn đã cứu tôi khỏi thảm họa. –

+0

haha, tuyệt vời! Mừng vì tôi có thể giúp. –

7

Bạn quên một điều (tôi nghĩ)

Dữ liệu tĩnh sẽ giống nhau đối với tất cả người dùng của ứng dụng, trong khi phiên là "cho mỗi người dùng".

Vì vậy, đối với kịch bản "Vai trò người dùng" của bạn, tôi mong đợi kết quả buồn cười;)

3

Trường tĩnh sẽ được chia sẻ trên tất cả người dùng.
Trong môi trường web, bạn sẽ có một số luồng chạy cùng nhau.

Cập nhật bất kỳ thành viên tĩnh nào sẽ cần kiểm soát đồng thời thích hợp. Xong sai, điều này sẽ làm chậm hiệu suất trang web của bạn một cách đáng kể.

Phiên có thể được di chuyển ra khỏi quá trình và được chia sẻ trên một trang trại.

Trong số các phiên proc sẽ tồn tại ngay cả khi máy chủ ứng dụng của bạn gặp sự cố.

+0

+1 để đề cập đến sự tương tranh. Ngay cả khi một thành viên tĩnh là sự lựa chọn đúng (đôi khi họ là tốt cho dữ liệu được chia sẻ) phải được đồng bộ đúng cách. –