ASP Application

全站共享变量、Lock / Unlock、Global.asa 初始化、计数器实战。

Intermediate
Key PointsApplication 是所有用户共享的存储;改它必须 Lock/Unlock 包起来,否则并发下会丢数据。

存与取

ASP
<%
    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

ASP
<%
    Application.Lock
    Application("visitCount") = Application("visitCount") + 1
    Application.Unlock

    Response.Write "本站访问次数:" & Application("visitCount")
%>
Output
本站访问次数:1024

Without 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.

计数器完整示例

ASP
<%
    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>
Output
您是第 1025 位访问者

Application 与 Session 的配合

ASP
<%
    ' 在线人数:进入时 +1,会话结束时 -1
    Application.Lock
    Application("online") = Application("online") + 1
    Application.Unlock

    Session("counted") = True
%>
ASP
<%-- 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 caseBetter choice
Config valuesApplication 可以,或写配置文件
Per-user dataSession 或数据库
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.

遍历与删除

ASP
<%
    Dim key
    For Each key In Application.Contents
        Response.Write key & " = " & Application(key) & "<br>"
    Next

    Application.Contents.Remove("hits")
    Application.Contents.RemoveAll
%>

Friends & Partners