||Before I delve into this FAQ, let me state that the short answer is: "No, use the free Lookup Component from Microsoft (or a free Dictionary Component from Caprock Consulting)." The remainder of this FAQ details why you should not create application-level Dictionary objects. (Also check out this Microsoft KB article: Scripting.Dictionary Object Fails in ASP Application Scope.)|
This question is a commonly asked ASPMessageboard.com question. In one particular post, the poster was trying:
If Not IsObject(Application("ChatUsers")) Then
Set Application("ChatUsers") = Server.CreateObject("Scripting.Dictionary")
and getting the following error:
Application object error 'ASP 0197 : 80004005'
Disallowed object use
/chat/default.asp, line 60
Cannot add object with apartment model behavior
to the application intrinsic object
(Line 60 being the line where
Set line where the Dictionary object was being created with
Set to an application-level variable.)
The problem is because the Dictionary object is apartment threaded, and apartment threading objects should not be placed in application scope, where multiple users may be trying to simultaneously access a single object instance. (For a more technical discussion on this check out: Thread Safety Issues, by Charles Carroll.)
Therefore, if you must use dictionary objects you can only use them on a page-level or session-level, as indicated by this Microsoft KB article: Scripting.Dictionary Object Fails in ASP Application Scope. There is nothing wrong with using an Dictionary object on a page-level basis but try to avoid using it on a session-level basis if you can help it. Storing objects in the session is evil and asking for trouble. And you don't want trouble, mister.
To summarize: you cannot use Dictionary objects as application-level variables due to their threading model. If you need to use a Dictionary-like object in the application-level use the free Lookup Component from Microsoft (or a free Dictionary Component from Caprock Consulting).
(To quote George Reilly, a Microsoft developer on the IIS team and a self-professed IIS Performance Guru: "... don't use Scripting.Dictionary at Session/Application scope in any version of IIS." See this tip.)