Hi Bill, You could spy on what order events are processing and objects are created using Trace logging. Call Trace.Write() in your Module's Init function and event handlers. Assign a random number ID property to the Module in the init function and output that ID in the trace function in each of the event handlers in your module, in Global.asax for BeginRequest, EndRequest, Application_Start, Application_End, etc.. You'll need to adjust web.config to dump the trace log to the browser. You can adjust the number of worker processes for your web app in the IIS admin in case you've only got one running now.
You will typically have at least one HttpApplication servicing an ASP.NET application, but there can be more than 1 (I use 1 instance per CPU and/or core for development). Each HttpApplication is maintaining a thread pool that it uses to generate an instance of the appropriate IHttpHandler (a page that derives from System.Web.UI.Page being the most common) for each incoming request & firing the HttpModule events before and possibly after the IHttpHandler runs. There are 2 collections/data stores that you can access during the course of request processing. HttpModules should have access to both. One is the Application collection and another is the Context collection (sometimes Context, sometimes HttpContext.Current). The Application collection is shared across all HttpApplication instances and is only emptied when the entire application recycles or the web server is shutdown. I don't think you'd get this IPC/shared memory behavior with a static property in your HttpModule. The Context collection only lives as long as current request. You can read & write to it in your HttpModule or in global.asax, and down at the page/control level. When you write a value to the context collection, it can't be accessed from another user's request thread and once the Response is sent back to the browser, it's gone forever. I'm 99% sure that access to the Application object is thread safe, but there is a performance penalty--while the application instance is waiting for a lock on the collection, the user's request is stalled. I don't think it can be used to share data across multi-server web farms (you'd probably have to use a DB server to store data for multiple servers to share), but I know that when you have multiple HttpApplication objects running on the same machine, they can share information through the collection. I'm not sure whether the compiler is protecting you from race conditions on volatile-type read-write operations. For example, if two instances of the HttpApplication try this at the same time, is it possible for the read and write parts to be interleaved? Application["RequestCount"] = ((int) Application["RequestCount"].ToString()) + 1; vs. lock(this) { Application["RequestCount"] = ((int) Application["RequestCount"].ToString()) + 1; } I'm not sure if you ended up picking up "Pro ASP.NET 3.5 in C# 2008" from APress, but it has a pretty good section on 'Diving into the Architecture of IIS' in Chapter 18. Also, these might be useful: http://msdn.microsoft.com/en-us/library/bb398986.aspx http://msdn.microsoft.com/en-us/library/ms227673.aspx http://msdn.microsoft.com/en-us/library/ms178473.aspx http://msdn.microsoft.com/en-us/library/bb470252.aspx Scott -----Original Message----- From: William G. Thompson, Jr. [mailto:wgt...@gmail.com] Sent: Friday, March 27, 2009 2:34 PM To: cas-dev@lists.jasig.org Subject: [cas-dev] HttpModule threading model Fellow Open Source DotNetHeads, Anyone have a good resource on the HttpModule/HttpApplication threading model? This thread (pardon the pun) [http://forums.asp.net/t/900381.aspx], seems to indicated that only one request will be using an instance of a HttpModule at a time. True? Bill -- You are currently subscribed to cas-dev@lists.jasig.org as: sholo...@rutgers.edu To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-dev -- You are currently subscribed to cas-dev@lists.jasig.org as: arch...@mail-archive.com To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-dev