Tôi sử dụng JQuery để thực hiện một lệnh gọi AJAX đơn giản đến một Trình xử lý HTTP giả không làm gì khác ngoài việc giữ cho Phiên của tôi tồn tại:
function setHeartbeat() {
setTimeout("heartbeat()", 5*60*1000); // every 5 min
}
function heartbeat() {
$.get(
"/SessionHeartbeat.ashx",
null,
function(data) {
//$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :)
setHeartbeat();
},
"json"
);
}
Trình xử lý phiên có thể đơn giản như sau:
public class SessionHeartbeatHttpHandler : IHttpHandler, IRequiresSessionState
{
public bool IsReusable { get { return false; } }
public void ProcessRequest(HttpContext context)
{
context.Session["Heartbeat"] = DateTime.Now;
}
}
Chìa khóa là thêm IRequiresSessionState, nếu không Session sẽ không khả dụng (= null). Tất nhiên, trình xử lý cũng có thể trả về một đối tượng được tuần tự hóa JSON nếu một số dữ liệu được trả về JavaScript đang gọi.
Được cung cấp thông qua web.config:
<httpHandlers>
<add verb="GET,HEAD" path="SessionHeartbeat.ashx" validate="false" type="SessionHeartbeatHttpHandler"/>
</httpHandlers>
được thêm từ balexandre vào ngày 14 tháng 8 năm 2012
Tôi rất thích ví dụ này, đến nỗi tôi muốn cải thiện bằng HTML / CSS và phần beat
thay đổi điều này
//$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :)
thành
beatHeart(2); // just a little "red flash" in the corner :)
và thêm
// beat the heart
// 'times' (int): nr of times to beat
function beatHeart(times) {
var interval = setInterval(function () {
$(".heartbeat").fadeIn(500, function () {
$(".heartbeat").fadeOut(500);
});
}, 1000); // beat every second
// after n times, let's clear the interval (adding 100ms of safe gap)
setTimeout(function () { clearInterval(interval); }, (1000 * times) + 100);
}
HTML và CSS
<div class="heartbeat">♥</div>
/* HEARBEAT */
.heartbeat {
position: absolute;
display: none;
margin: 5px;
color: red;
right: 0;
top: 0;
}
đây là một ví dụ trực tiếp chỉ cho phần đánh bại: http://jsbin.com/ibagob/1/