Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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#_Sql - Fatal编程技术网

C# 记录用户登录以报告客户端超过许可证数量

C# 记录用户登录以报告客户端超过许可证数量,c#,sql,C#,Sql,我是商业Windows应用程序(c#)的首席开发人员。新的要求是跟踪滥用许可证的客户 例如:假设一个客户购买了10个用户的许可协议,即在任何给定时间同时购买10个用户 我需要能够报告,回顾历史,所有的时间,客户有超过10个用户同时登录 我已经有了一个包含以下列的用户表:userid(主键)、pw、lastLogin、lastLogout 我正在考虑创建一个新的“日志记录”表,每次用户注销时都会在其中添加一个新行……列可能包括: LogId、UserId、LoginDateTime、LogoutD

我是商业Windows应用程序(c#)的首席开发人员。新的要求是跟踪滥用许可证的客户

例如:假设一个客户购买了10个用户的许可协议,即在任何给定时间同时购买10个用户

我需要能够报告,回顾历史,所有的时间,客户有超过10个用户同时登录

我已经有了一个包含以下列的用户表:userid(主键)、pw、lastLogin、lastLogout

我正在考虑创建一个新的“日志记录”表,每次用户注销时都会在其中添加一个新行……列可能包括:

LogId、UserId、LoginDateTime、LogoutDateTime

…然后我会有用户每次登录/退出应用程序的历史记录

但我不确定这种表设计是否能为报告提供高效的计算……我是否使用SQL或c#来执行计算对我来说并不重要,只要它相当快

希望有人能对如何更好地设计此表有一个好主意,这样当客户超过许可证限制时,我可以快速计算任何/所有时间点


注意:我不想阻止11t、12th等用户使用该应用程序…要求是向用户显示警告消息,但允许他继续工作…

表结构的问题(LogId、UserId、LoginDateTime、LogoutDateTime)这是因为聚合变得很困难——查看每个人在指定时间使用系统的查询很容易,但获取所有时间的用户数却很困难

一种可能的方法是对数据进行位反规范化,并记录使用单位,而不是跨度。您可以使用表结构(UserId、BlockDateTime)在30分钟内跟踪使用情况

如果BettyR从上午10:05到11:45使用系统,请在表中创建四条记录:

BettyR, 10:00am
BettyR, 10:30am
BettyR, 11:00am
BettyR, 11:30am
然后,您可以使用带有GROUPBY子句的普通SQL查询来查找每半小时内使用系统的不同用户的数量

select ...
from UsageBlocks
group by BlockDateTime
having count(*) > 10

根据您的需求,您可以使用报告应用程序对这些特定时间段执行更深入的分析。

另一个选项是创建用户会话表。当用户登录时,将其会话插入表中。当他们注销时,将其删除。这样,您就可以轻松地找到连接的用户数量

然后,您可以在insert(可能还有delete)上创建一个触发器,并根据会话计数从那里登录。如果你也记录删除,你就知道他们使用过多用户的时间长度了


还请记住,您必须适当地清理孤立连接。

将会话的开始和结束视为需要记录的事件。您可以创建一个表来记录这些事件

因此,开始和结束的会话在表中有两个条目——一个用于会话开始,一个用于会话结束。您只向表中添加记录,从不修改以前的记录。该表现在可以非常简单地跟踪打开会话的数量,方法是向记录添加“会话计数”字段,该字段在会话开始事件发生时从上一条记录的会话计数值递增,在会话结束事件发生时递减

“会话计数”列现在为我们提供了一个逐段连续函数,可以计算并发会话的数量

示例数据:

    SessionId  EventType  .... your session data here ... SessionCount   
1.     1         Login         ................                 1
2.     2         Login         ................                 2
3.     3         Login         ................                 3
4.     1         Logout        ................                 2
5.     4         Login         ................                 3
6.     4         Logout        ................                 2
7.     2         Logout        ................                 1
8.     3         Logout        ................                 0
9.     5         Login         ................                 1
10.    6         Login         ................                 2
需要担心的事情:

  • 您必须确保将开始/结束事件配对,因此在发生任何故障时,仍必须生成会话结束事件
  • 你需要这张桌子是防篡改的吗?如果是这样,我也有一个技巧

  • 编辑:请注意,我把“你的会话数据放在这里”的地方,我真正的意思是“你的会话事件数据在这里”。诸如时间戳之类的信息将放在这里。应使用另一个表来跟踪两个事件共有的会话信息,例如拥有会话的用户的身份(对两个表使用相同的SessionId键)。

    我建议使用呼叫总部功能,类似于通过web方法向您发出警报或登录,以便您可以跟踪谁在做什么…但只有当他们超出限制时才可以。(研究WCF的几种方法)


    这样你就可以跟踪它们的使用情况。向他们收取额外费用或重新谈判他们的合同对于真实数据来说是有意义的。如果你擅长客户服务,那么这不应该让他们很恼火,特别是如果你指出你需要一个基础设施来为一个过时的用户群提供服务。想必你也会很清楚地告诉他们你的许可证方案……

    我会谨慎地以这种方式执行类似许可证检查的操作,因为(如前所述,如果你的应用程序崩溃,或者即使用户以特定方式退出,你也不会得到注销事件)(从任务管理器ALT+F4结束进程,而不是通过文件| Exit等)

    因此,随着用户使用该应用程序,您可能会有越来越多的死机会话。不仅您可能会获得错误的数据和用户印象,更重要的是,他们会因为收到不该收到的警告消息而变得沮丧。如果您试图告诉他们他们正在违反许可证,而实际上他们并没有这样做,他们可能会受到冒犯。这是失去客户的好方法

    我想说一个合理的许可证检查方案需要客户控制之外的中央服务器,并且客户可以访问互联网。它可以是这样的:

  • 启动应用程序、程序时 通知许可证服务器新的许可证 会议
  • 在申请工作中,程序 周期性地(比如1x 5分钟或 因此)向许可证发送状态信号 服务器
  • 在正常退出程序时,它 发送