2009-03-07 27 views
10

Tôi đang làm việc trong ứng dụng trò chuyện, tôi đã sử dụng HashTable để chứa Người dùng và Nhà điều hành làm Khóa & Đối tượng của Lớp ChatRoom dưới dạng giá trị của HashTable. Vấn đề chính là khi người dùng hoặc nhà điều hành đóng trình duyệt hoặc ngắt kết nối mà không đăng xuất thì nó sẽ tự động đăng xuất vào cuối phiên.Làm thế nào để xử lý kết thúc phiên trong global.asax?

Vui lòng giúp tôi liên quan đến điều đó và cách sử dụng Global.asax trong vấn đề này.

Trả lời

14

Thêm tệp Global.asax vào trang web của bạn và trong sự kiện Session_End, bạn xóa người dùng khỏi HashTable của mình.

protected void Session_End(Object sender, EventArgs e) 
{ 
    // Remove user from HashTable 
} 
+0

Trong bảng băm chứa khóa, cũng là Phiên ["UserID"] chứa, Phiên này được sử dụng để truyền tham số usrid của Đăng xuất (chuỗi usrid), trong sự kiện Session_End, Nếu bạn có bất kỳ ý tưởng thì hãy giúp tôi ... –

+2

Tôi không hiểu câu hỏi của bạn. Lấy làm tiếc. – MartinHN

24

Bạn có thể sử dụng sự kiện phiên cuối global.asax để loại bỏ người dùng bất ngờ bị ngắt kết nối:

void Session_End(Object sender, EventArgs E) { 
    // Clean up session resources 
} 

nhưng hãy cẩn thận, phiên không kết thúc khi người dùng đóng trình duyệt của mình hoặc kết nối của mình bị mất. Nó kết thúc khi hết thời gian chờ phiên.

+0

Nếu tôi thay đổi tệp Web.config cho Session TimeOut, nó có hoạt động không? –

+0

không, bạn có thể giảm thời gian chờ của phiên, nhưng nó ảnh hưởng đến toàn bộ ứng dụng một cách bất ngờ. Có thể bạn có thể đặt một điều khiển có lập trình trên ứng dụng trò chuyện của mình. ví dụ: nếu người dùng không thực hiện bất kỳ hành động nào trong 5 phút, bạn có thể giả định anh ấy bị ngắt kết nối .. – Canavar

+2

nhận xét của @ ashishbhatt là chính xác với tôi. Bạn có thể giảm thời gian chờ của phiên nhiều (cụ thể là 1 phút) nhưng ** sau đó bạn phải chắc chắn rằng ** ít nhất một cuộc gọi AJAX không hoạt động được thực hiện liên tục như một nhịp tim (hoặc tiếp tục sống). Đây chỉ là một thủ thuật, và không phải là quy mô cho hàng triệu người dùng –

6

Sự kiện Session_End không kích hoạt khi trình duyệt bị đóng, nó sẽ kích hoạt khi máy chủ không nhận được yêu cầu từ người dùng trong một thời gian cụ thể (theo mặc định là 20 phút). Điều đó có nghĩa là nếu bạn sử dụng Session_End để xóa người dùng, họ sẽ ở lại trong cuộc trò chuyện trong 20 phút sau khi họ đã đóng trình duyệt.

Tôi khuyên bạn nên giữ thời gian của yêu cầu cuối cùng trong đối tượng người dùng. Bằng cách đó bạn có thể xác định người dùng đang hoạt động như thế nào và khả năng người dùng đã rời khỏi cuộc trò chuyện đó như thế nào. Ví dụ: bạn có thể hiển thị bất kỳ người dùng nào chưa thực hiện bất kỳ điều gì trong hai phút là không hoạt động.

Bạn cũng có thể cho phép ứng dụng trò chuyện thăm dò ý kiến ​​máy chủ định kỳ (nếu bạn chưa thực hiện điều đó). Điều này sẽ cập nhật thời gian yêu cầu cuối cùng trong đối tượng và giữ cho người dùng còn sống miễn là cửa sổ trò chuyện đang mở.

Bạn có thể sử dụng sự kiện onunload trong trình duyệt để gửi yêu cầu đăng xuất tới máy chủ khi người dùng rời khỏi trang. Điều này tất nhiên chỉ hoạt động nếu người dùng vẫn có kết nối mạng. Sự kiện onunload cũng được kích hoạt khi bạn tải lại trang, vì vậy bạn sẽ phải theo dõi lý do sự kiện được kích hoạt để sử dụng nó.

+1

nhờ Guffa, Nếu tôi sử dụng sự kiện onunload thì nó sẽ gọi Leave() nhưng trong vấn đề chính là khi tôi làm mới nút thì nó sẽ gọi Leave() , Tôi xử lý F5, AlterF4, Nhấp chuột phải vào cơ thể, nhưng Làm thế nào có thể xử lý nút Refresh được nhấp trong tất cả các trình duyệt? Nếu có ý tưởng nào thì hãy giúp tôi. –

1

Bạn có thể JavaScript luôn chạy trên máy khách và gửi tín hiệu đến máy chủ như "Tôi ở đây". Nếu tín hiệu tiếp theo không đến, bạn có thể gọi Leave();. Tôi đã sử dụng AJAX để làm điều này.

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