Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何记录实时用户?_C#_Asp.net - Fatal编程技术网

C# 如何记录实时用户?

C# 如何记录实时用户?,c#,asp.net,C#,Asp.net,我正在记录哪些用户登录到应用程序和时间。我看到时间是基于应用服务器的,这是Azure,所以它不是实时的。我很想显示他们登录的真实时间。似乎应用服务器是默认的,如何使这一次更合法 var loginAudit = new LogInAudit(); loginAudit.CLIENT_IP = FDB.Utils.GetClientIP(); loginAudit.LOGIN_TIME = DateTime.Now; loginAudit.LOGIN_USER_ID = objUser.Login

我正在记录哪些用户登录到应用程序和时间。我看到时间是基于应用服务器的,这是Azure,所以它不是实时的。我很想显示他们登录的真实时间。似乎应用服务器是默认的,如何使这一次更合法

var loginAudit = new LogInAudit();
loginAudit.CLIENT_IP = FDB.Utils.GetClientIP();
loginAudit.LOGIN_TIME = DateTime.Now;
loginAudit.LOGIN_USER_ID = objUser.LoginID;
loginAudit.LOGOUT_TIME = null;
loginAudit.TYPE = "IN";
loginAudit.USER_ID = objUser.UserID;

db.Entry(loginAudit).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();

如果您的所有用户都在一个时区内,那么我过去所做的就是将服务器上的时间更改为正确的时间:-)结果很好

var loginAudit = new LogInAudit();
loginAudit.CLIENT_IP = FDB.Utils.GetClientIP();
loginAudit.LOGIN_TIME = DateTime.Now;
loginAudit.LOGIN_USER_ID = objUser.LoginID;
loginAudit.LOGOUT_TIME = null;
loginAudit.TYPE = "IN";
loginAudit.USER_ID = objUser.UserID;

db.Entry(loginAudit).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();

如果用户跨越多个时区,则需要捕获用户所属的时区,并将日期存储在UTC时间中。UTC时间是世界时,您可以通过时区将其转换为本地时间。这就是它通常的处理方式。

显示相对于客户端特定时区的日期通常被认为是一个显示问题,每当您处理存储日期/时间时,几乎总是建议您将其记录为UTC。目前,您正在根据审核记录记录服务器的本地时间,这对于您的客户机来说毫无意义

var loginAudit = new LogInAudit();
loginAudit.CLIENT_IP = FDB.Utils.GetClientIP();
loginAudit.LOGIN_TIME = DateTime.Now;
loginAudit.LOGIN_USER_ID = objUser.LoginID;
loginAudit.LOGOUT_TIME = null;
loginAudit.TYPE = "IN";
loginAudit.USER_ID = objUser.UserID;

db.Entry(loginAudit).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();
您要做的是在DB记录中记录当前UTC时间

var loginAudit = new LogInAudit();
loginAudit.CLIENT_IP = FDB.Utils.GetClientIP();
loginAudit.LOGIN_TIME = DateTime.Now;
loginAudit.LOGIN_USER_ID = objUser.LoginID;
loginAudit.LOGOUT_TIME = null;
loginAudit.TYPE = "IN";
loginAudit.USER_ID = objUser.UserID;

db.Entry(loginAudit).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();
loginAudit.LOGIN_TIME = DateTime.UtcNow;
然后在显示时,将其转换回本地时间

var loginAudit = new LogInAudit();
loginAudit.CLIENT_IP = FDB.Utils.GetClientIP();
loginAudit.LOGIN_TIME = DateTime.Now;
loginAudit.LOGIN_USER_ID = objUser.LoginID;
loginAudit.LOGOUT_TIME = null;
loginAudit.TYPE = "IN";
loginAudit.USER_ID = objUser.UserID;

db.Entry(loginAudit).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();
为了做到这一点,您需要具有文化意识,换句话说,您需要知道客户机所在的时区,以便将UTC转换回本地。例如,如果我是一名客户,我将在
GMT标准时间
Time工作,因此为了让我看到相对于我的审计时间,您需要执行以下操作

var loginAudit = new LogInAudit();
loginAudit.CLIENT_IP = FDB.Utils.GetClientIP();
loginAudit.LOGIN_TIME = DateTime.Now;
loginAudit.LOGIN_USER_ID = objUser.LoginID;
loginAudit.LOGOUT_TIME = null;
loginAudit.TYPE = "IN";
loginAudit.USER_ID = objUser.UserID;

db.Entry(loginAudit).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();
var gmt = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
var localTime = tzi.ConvertTimeFromUtc(loginAudit.LOGIN_TIME, gmt);
就如何从客户端获取这些信息而言,有多种方法可以做到这一点,比如简单地让用户从可用TZ列表中进行选择(可靠但具有侵入性),或者使用a根据其IP查找信息(对用户而言,不是那么可靠,而是更好的UX)-我将让您调查并决定哪一个最适合您的应用程序

var loginAudit = new LogInAudit();
loginAudit.CLIENT_IP = FDB.Utils.GetClientIP();
loginAudit.LOGIN_TIME = DateTime.Now;
loginAudit.LOGIN_USER_ID = objUser.LoginID;
loginAudit.LOGOUT_TIME = null;
loginAudit.TYPE = "IN";
loginAudit.USER_ID = objUser.UserID;

db.Entry(loginAudit).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();

或者,如果您不想处理时区,只想处理日期,您可以将偏移量与UTC时间一起存储,这将为您提供计算后的本地时间-请参阅。

当您说“实时”时,你是指用户当前时区中的时间吗?是的,用户的时间。也许是这样。如果你与@ .PulWestBrg对@ PASTHOLD问题的回答一起,你应该考虑在服务器上使用NODA时间,因为.NET和Windows使用与TimeStand不同的命名约定(与该名称匹配)。。如何捕捉用户所属的时区?@RobertHarvey对于合适的客户来说,这很容易。对于web应用程序,我能想到的唯一方法是在足够多的点上对转换函数进行采样,以唯一地确定时区。您没有解释如何从客户端获取实际时区。@RobertHarvey我犹豫了,因为有太多的选项,为了完整起见,我添加了一个关于捕获这些信息的方法的小片段。
var loginAudit = new LogInAudit();
loginAudit.CLIENT_IP = FDB.Utils.GetClientIP();
loginAudit.LOGIN_TIME = DateTime.Now;
loginAudit.LOGIN_USER_ID = objUser.LoginID;
loginAudit.LOGOUT_TIME = null;
loginAudit.TYPE = "IN";
loginAudit.USER_ID = objUser.UserID;

db.Entry(loginAudit).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();