ASP Application
全站共享变量、Lock / Unlock、Global.asa 初始化、计数器实战。
存与取
<%
Application("siteName") = "我的站点"
Application("visitCount") = 0
Response.Write Application("siteName")
%>Application lives from site start until IIS stops or the app pool recycles. All users share one copy, so it suits configuration and counters, never per-user data.
Lock 与 Unlock
<%
Application.Lock
Application("visitCount") = Application("visitCount") + 1
Application.Unlock
Response.Write "本站访问次数:" & Application("visitCount")
%>本站访问次数:1024Without Lock two requests can both read 1024 and write 1025 — two visits, one increment. Lock blocks other requests, so keep the guarded block as short as possible.
计数器完整示例
<%
Dim count
Application.Lock
If IsEmpty(Application("hits")) Then
Application("hits") = 0
End If
Application("hits") = Application("hits") + 1
count = Application("hits")
Application.Unlock
%>
<p>您是第 <%= count %> 位访问者</p>您是第 1025 位访问者Application 与 Session 的配合
<%
' 在线人数:进入时 +1,会话结束时 -1
Application.Lock
Application("online") = Application("online") + 1
Application.Unlock
Session("counted") = True
%><%-- Global.asa 里的 Session_OnEnd --%>
<script language="VBScript" runat="Server">
Sub Session_OnEnd
Application.Lock
Application("online") = Application("online") - 1
Application.Unlock
End Sub
</script>Online counts add on entry and subtract on session end. Session_OnEnd fires only on timeout or Abandon, never on a server crash — the number drifts high and needs periodic correction.
什么时候不该用
| Use case | Better choice |
|---|---|
| Config values | Application 可以,或写配置文件 |
| Per-user data | Session 或数据库 |
| Large datasets | 数据库 + 缓存 |
| Cross-server | 数据库或 Redis |
Application lives in one IIS process; multiple servers each have their own copy with no sync. It is unusable in a cluster — one of the fundamental reasons classic ASP does not scale out.遍历与删除
<%
Dim key
For Each key In Application.Contents
Response.Write key & " = " & Application(key) & "<br>"
Next
Application.Contents.Remove("hits")
Application.Contents.RemoveAll
%>存与取
<%
Application("siteName") = "我的站点"
Application("visitCount") = 0
Response.Write Application("siteName")
%>Application 的生命周期从站点启动到 IIS 停止或应用池回收。所有用户看到的是同一份数据,所以它适合放配置、计数器,不适合放用户相关的信息。
Lock 与 Unlock
<%
Application.Lock
Application("visitCount") = Application("visitCount") + 1
Application.Unlock
Response.Write "本站访问次数:" & Application("visitCount")
%>本站访问次数:1024不加 Lock 时,两个请求可能同时读到 1024,各自加一写回 1025——实际访问两次却只加了一次。Lock 会阻塞其他请求,所以包住的代码要尽可能短。
计数器完整示例
<%
Dim count
Application.Lock
If IsEmpty(Application("hits")) Then
Application("hits") = 0
End If
Application("hits") = Application("hits") + 1
count = Application("hits")
Application.Unlock
%>
<p>您是第 <%= count %> 位访问者</p>您是第 1025 位访问者Application 与 Session 的配合
<%
' 在线人数:进入时 +1,会话结束时 -1
Application.Lock
Application("online") = Application("online") + 1
Application.Unlock
Session("counted") = True
%><%-- Global.asa 里的 Session_OnEnd --%>
<script language="VBScript" runat="Server">
Sub Session_OnEnd
Application.Lock
Application("online") = Application("online") - 1
Application.Unlock
End Sub
</script>在线人数靠「进站加一、会话结束减一」。但 Session_OnEnd 只在会话正常超时或 Abandon 时触发,服务器崩溃时不会执行——数字会虚高,需要定期校正。
什么时候不该用
| 场景 | 更好的选择 |
|---|---|
| 站点配置 | Application 可以,或写配置文件 |
| 用户数据 | Session 或数据库 |
| 大数据集 | 数据库 + 缓存 |
| 多服务器 | 数据库或 Redis |
Application 存在单个 IIS 进程里,多台服务器各有一份,互相不同步。做集群时它完全不能用——这也是经典 ASP 难以水平扩展的根本原因之一。遍历与删除
<%
Dim key
For Each key In Application.Contents
Response.Write key & " = " & Application(key) & "<br>"
Next
Application.Contents.Remove("hits")
Application.Contents.RemoveAll
%>