从 IIS 获取我托管的 Asp.Net 网站的运行会话计数

Posted

技术标签:

【中文标题】从 IIS 获取我托管的 Asp.Net 网站的运行会话计数【英文标题】:Get running session count from IIS for my hosted Asp.Net web site 【发布时间】:2012-04-01 20:04:29 【问题描述】:

我在 IIS 6.0 中托管一个 Asp.Net 网站

我们必须在 web.config 中重置会话超时

我的客户希望我仅在没有会话正在运行(没有人在使用该站点)时重置它。

我们没有使用 Membership 并且 SessionState 设置为 InProc

我如何知道是否有人使用该网站或任何会话正在运行。

我无法更改托管网站中的源代码或除 web.config 之外的任何其他文件。

【问题讨论】:

所以他想添加一个新功能,而不更改代码?无论如何,这实际上是不可能的,但是您可以通过跟踪活动(而不是会话)来获得最佳猜测。也就是说,唯一的其他选项如前所述,请查看日志文件。此外,由于它是一个共享主机,也许他们在站点控制面板中有一些功能(如果他们给了你一个),可以向你显示日志/活动?也许打电话给他们并要求类似的东西,或者看看他们如何为您提供帮助。 【参考方案1】:

我不擅长 PowerShell,所以希望您可以查找正确的语法。但是……

一种选择是运行 Powershell 脚本并检查会话计数,如下所示:

更新:将“会话总数”更改为“活动会话”

write-host Getting performance counters ...

$perfCounterString = "\asp.net applications(__total__)\sessions active" 
$counter = get-counter -counter $perfCounterString 
$rawValue = $counter.CounterSamples[0].CookedValue 

write-host Session Count is $rawValue

if( $rawValue -gt 0)

   write-host Session are active - will not stop IIS
   exit


write-host Stopping IIS
stop-service "IISAdmin"

# Set values 
$webConfig = "d:\web.config"
$newTimeout = "20"

# Open file and change value
$doc = new-object System.Xml.XmlDocument
$doc.Load($webConfig)
$doc.SelectSingleNode("//sessionState").timeout = $newTimeout
$doc.Save($webConfig)

write-host Starting IIS
start-service "IISAdmin"
write-host Done!

在桌面上将它保存为“ChangeIIS.ps1”。

现在 Powershell 不喜欢你只运行像 .bat 文件这样的脚本。出于安全原因,您必须授予对进程或用户的访问权限。因此,请执行以下操作:

    打开命令提示符并以管理员身份运行 输入powershell 输入Set-ExecutionPolicy -scope process Bypass 键入sl <path to directory of .sp1 file>sl [set-location] 就像命令提示符中的cd 输入$ '.\ChangeIIS.ps1'

它将立即运行并重置值。

这是我在how I created the PowerShell script上的博客的链接 以更循序渐进的方式

【讨论】:

我对 PowerShell 一无所知。你能举例说明如何创建和执行它,在服务器上运行是否安全? 是的,它是安全的,因为您知道脚本在做什么。 这个看起来不错,测试后会告诉你的。 我运行部分代码,只是为了检查它打印的计数。我看到了 18。后来我搜索更多并将“\asp.net applications(total)\sessions total”更改为“\asp.net applications(total)\sessions active “它显示 2 个计数,我创建了另一个会话,计数增加到 3。我再次检查并发现没有其他用户在使用该站点,我认为计数为 3,因为 2 个用户可能正在使用托管在 IIS 中的其他站点.你能把代码站点具体化吗?我的更改是否可以仅用于检查活动会话数,还是需要进行更多更改? 是的,你是对的,使用 active。 Total 是放弃、超时和活动的总数。它可以特定于站点。 Total 将所有实例聚集在一起。要查看其他可用的选项,请打开“perfmon.exe”并为 ASP.NET 应用程序、会话活动添加性能计数器,那里有一个子类别以及 Total。它应该命名活动实例【参考方案2】:

检查您网站的 IIS 日志文件并查看最后一次点击的时间(实际用户,而不是搜索机器人)。

如果最后一次点击早于当前会话超时,则不存在活动会话。这才是您真正要寻找的,而不是计数。

无需编程或破解。

【讨论】:

感谢您的回答,我可以看到日志文件夹,但是当我尝试打开它时,它说我没有访问权限。 您能否发布您要打开的文件夹路径?另外,您要打开的是 文件夹 还是 日志文件?如果您要托管该网站,您应该拥有一个具有一些更高级别权限的帐户? 在 IIS6 上,日志默认为文件夹 C:\Windows\System32\LogFiles\,然后是子文件夹 W3SVC 12345678。您可以使用 IIS6 管理器来检查站点上是否启用了日志记录 - 这将向您显示实际的文件夹路径和 W3SVC 文件夹名称。 这看起来很奇怪,因为这表明可以从浏览器请求日志,这可能是一个安全漏洞。无论如何,我认为我们的观点是,如果您在服务器上托管一个网站,并且您无法查看服务器上的日志文件,那么您就会遇到用户权限问题。修复这些,然后阅读您的日志文件。 它是一个共享主机,谁知道他们如何让你访问日志:)【参考方案3】:

如果有人正在使用站点,那么会话超时它不会执行..

所以不用担心

(Timeout 属性指定分配给应用程序的 Session 对象的超时期限,以分钟为单位。如果用户在超时期限内没有刷新或请求页面,则会话结束。

) 与 IIS 的会话 http://msdn.microsoft.com/en-us/library/ms525473(v=vs.90).aspx

与配置文件的会话 http://msdn.microsoft.com/en-us/library/ms178586.aspx

【讨论】:

我想更改特定 asp.net 应用程序的 web.config 文件中的会话超时。然后您提供的链接告诉您 IIS 中的会话超时。 当我更改 web.config 时,所有会话都会过期 嘿,亲爱的...如果您使用 web.config 更改任何内容(不仅仅是会话)...会话总是过期...这是 Microsoft 的规则...所以不可能实现这一点。 .. 尝试使用会话模式 = sql server msdn.microsoft.com/en-us/library/h6bb9cz9(v=vs.71).aspx ......【参考方案4】:

我认为这里的简单答案是“不可能”。您可以学习,请参阅ASP.NET 性能计数器 上的答案。我对它的进展非常感兴趣(如果它对您有用),以及它是否为您提供特定于应用程序的数据(与 aggregate of all applications on the box? 相比)。

即使是查看日志文件的建议也无法得到您想要的 - 当您查看日志文件时,您怎么知道没有用户开始会话?

会话是浏览器的 cookie。因此,如果访问您网站中的 1 个页面,我会离开您的网站并转到其他网站,然后再回来(在您设置的任何超时值之前)?你会如何定义它?在我离开您的网站时,您将看不到“任何”活动(无论您使用什么显示器),但这并不意味着我的会话“已过期”。

它甚至不必那么复杂 - 我访问您的网站,并开始阅读您的内容(不导航,不做任何可以测量/监控的事情)。

我想“目标”需要更加明确——比如你追求什么?重置的目标并不是您想要实现的真正“目标”。

更新:

我知道你说过你不能修改源代码,所以你可以希望它实现了 Google Analytics。如果是这样,您可以查看您网站的实时活动。这至少让你以某种微不足道的方式“到达某个地方”。 但是同样,“魔法”是基于 cookies (因此意味着它仍然受制于我上面提出的问题)

【讨论】:

【参考方案5】:

在会话开始和会话结束事件中不断增加和减少应用程序变量。那么您将获得会话计数。如果 sesson 计数为零,那么您可以重置事物。一切顺利。

【讨论】:

以上是关于从 IIS 获取我托管的 Asp.Net 网站的运行会话计数的主要内容,如果未能解决你的问题,请参考以下文章

用户运行托管 IIS 链接时如何在 asp.net 中获取客户端 IP 地址

ASP.NET 获取IIS应用程序池的托管管道模式

IIS 和托管的 ASP.Net 应用程序

在 IIS7 中托管 ASP.NET 会导致访问被拒绝?

从 C# 调用 WebApi 获取异常 HttpRequestException

在 IIS 中托管 ASP Net Core 应用程序时无限页面加载