我一直在爲此工作custom timer
我爲每個用戶的login session
創建。到目前爲止,我無法爲每個登錄會話創建個人timers
。如何爲個人用戶創建登錄會話計時器
場景:
當User1
登錄時,timer will start counting
。當User2
登錄時,Use1的計時器將重置該值與User2的計時器相同。 看來他們有one timer
(不是個人)。
這是我想要發生的事情。
- 當USER1登錄時,他的計時器將開始計數。
- 如果計時器達到900秒(15分鐘),它會彈出一些模式框,告訴他的會話超時。
- 的模式將顯示計數倒計數後下來至少30秒
- ,用戶將被註銷自動
- 每個用戶都必須有自己的計時器
我已經做了所有的這些除了最後一個項目Every user must have their own timers
下面是創建一個計時器我的代碼:
public class SessionTimer
{
private static Timer timer;
public static void StartTimer()
{
timer = new Timer();
timer.Interval = (double)Utility.ActivityTimerInterval();
timer.Elapsed += (s, e) => MonitorElapsedTime();
timer.Start();
}
public static void ResetTimer()
{
TimeCount = 0;
timer.Stop();
timer.Start();
}
public static int TimeCount { get; set; }
public static string ConnectionID { get; set; }
private static void MonitorElapsedTime()
{
if (TimeCount >= Utility.TimerValue())
{
timer.Stop();
Hubs.Notifier.SessionTimeOut(TimeCount);
}
else
{
Hubs.Notifier.SendElapsedTime(TimeCount);
}
TimeCount++;
}
}
成功登錄後,我要打電話定時器開始
[HttpPost]
public ActionResult SignIn(LoginCredentials info)
{
// Success full login
SessionTimer.StartTimer();
}
這裏是服務器的signalr代碼:
public class SessionTimerHub : Hub
{
public void SendTimeOutNotice(int time)
{
Clients.Client(Context.ConnectionId).alertClient(time);
}
public void CheckElapsedTime(int time)
{
Clients.Client(Context.ConnectionId).sendElapsedTime(time);
}
public void UpdateConnectionID(string id)
{
SessionTimer.ConnectionID = id;
}
}
public class Notifier
{
public static void SessionTimeOut(int time)
{
var context = GlobalHost.ConnectionManager.GetHubContext<SessionTimerHub>();
context.Clients.Client(SessionTimer.ConnectionID).alertClient(time);
}
public static void SendElapsedTime(int time)
{
var context = GlobalHost.ConnectionManager.GetHubContext<SessionTimerHub>();
context.Clients.Client(SessionTimer.ConnectionID).sendElapsedTime(time);
}
}
而jQuery代碼:
$(function() {
/////////////////////////////////////////////////// SESSION TIMER
var timer = $.connection.sessionTimerHub, $modaltimer = $('#session_timer_elapsed'), tt = null;
timer.client.alertClient = function (time) {
var $count = $modaltimer.find('.timer'), wait = 180;
$count.text(wait);
$modaltimer.modal('show');
tt = setInterval(function() {
$count.text(wait--);
if (wait < 0) {
$.post('@Url.Action("Logout", "Auth")', function() { window.location.reload(); });
window.clearInterval(tt);
}
}, 1000);
};
timer.client.sendElapsedTime = function (time) {
console.log(time);
};
$.connection.hub.start().done(function() {
timer.server.updateConnectionID($.connection.hub.id);
});
$modaltimer.on('click', '.still_here', function() {
$.post('@Url.Action("ResetTimer", "Auth")');
$modaltimer.modal('hide');
window.clearInterval(tt);
}).on('click', '.log_out', function() {
$.post('@Url.Action("Logout", "Auth")', function() { window.location.reload(); });
$modaltimer.modal('hide');
});
});
正如你可以看到我這樣做:
timer.server.updateConnectionID($.connection.hub.id);
通過連接ID,因爲我不能得到的ID內public class Notifier
我失敗的解決方案
我試圖把SessionTimer
在session
使用dynamic
和ExpandoObject
如:
public static dynamic Data
{
get
{
#region FAILSAFE
if (HttpContext.Current.Session[datakey] == null)
{
HttpContext.Current.Session[datakey] = new ExpandoObject();
}
#endregion
return (ExpandoObject)HttpContext.Current.Session[datakey];
}
}
它成功地分離了定時器。但是經過我的expandoobject可變
e.g連接ID時:
public void UpdateConnectionID(string id)
{
MyExpandoObject.MySessionTimer.ConnectionID = id;
}
它拋出空引用異常。看起來我的expandoObject在傳遞來自SignalR的數據時變得空(只是我的想法),但我不確定。
請幫助我使用這些個人計時器,並在特定用戶的計時器已過時發送消息給特定用戶。
請注意
我想在服務器端創建計時器。
重置從服務器
定時器,定時器必須能夠在服務器上重新設置。在這種情況下,我把當用戶通過[BasecampAuthorize]
這意味着他做了一個活動上的每個AcrionReseult
例如爲:
[HttpPost]
[BasecampAuthorize]
public ActionResult LoadEmailType()
{
return Json(Enum.GetNames(typeof(EmailType)).ToList());
}
自定義屬性。
裏面[BasecampAuthorize]
public class BasecampAuthorizeAttribute : AuthorizeAttribute
{
string url { get; set; }
public BasecampAuthorizeAttribute()
{
if (string.IsNullOrEmpty(url))
{
url = "~/SomeUrl";
}
}
public BasecampAuthorizeAttribute(string URL)
{
url = URL;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.HttpContext.Response.Redirect(url);
}
else
{
// MUST RESET SESSION TIMER HERE
}
base.OnAuthorization(filterContext);
}
}
@ halter73 - 我怎麼能在這裏所說的復位定時器?
請給一些理由否決。我在問一個很難回答的問題。 – fiberOptics
嗯......可能你討厭我的問題。好的,謝謝。 – fiberOptics
我認爲人們把問題投下來的原因是你不用這種方式創建軟件。爲什麼每個客戶在服務器上都需要自己的計時器?爲什麼他們不能從服務器獲得簽名的令牌,而只是在一定的時間內有效,然後讓客戶端的JavaScript實現計時器? – Henrik