简体   繁体   中英

Hook into Application_Start in a HttpModule

I'm implementing a simple HttpModule, where I want some code to run when the web application is started. But I'm surprised to find that the Application_Start event I would normally use from Global.asax is not available from a HttpModule. Is that correct, or am I missing something here?

How do I hook into the Application_Start event from an HttpModule?

Update:
I've come to simple solution using the Init event instead, but it still smells a bit funny to me.

You CAN use HttpModule to handle application start event

Contrary to others that only write/believe what they read I've done my own part and found out it's possible to handle Application start using an HTTP module. It's a bit of a hack really but it reliably works. It's definitely not something someone should avoid, because I've seen it in MS modules as well (namely Sharepoint 2010 SPRequestModule ) This blog post of mine ( Writing a custom IHttpModule that handles Application_Start event ) will get you all the information you need to know about this. I've done it myself and it simply works. But you have to be a bit careful when using common resources, because your application may start behaving weird. To avoid this I suggest you read an additional blog post of mine, that explains why this happens and how to avoid it.

If you want it to be thread safe as well, you can also lock execution and then mark module as application started . It's the safest way of doing it.

private static bool isStarted = false;
private static object moduleStart = new Object();
...
if (!isStarted)
{
    lock(moduleStart)
    {
        if (!isStarted)
        {
            // handle aplication start
            ...
            isStarted = true;
        }
    }
}

I've created my own library that hooks to existing applications like Sharepoint 2010. I don't want to change Global.asax of Sharepoint now do I? Using technique explained in the blog post, I was able to hook into it. Easily.

And I guess this is exactly what you've been looking for. Hooking into start event of an arbitrary application by adding a module into web.config . Do it this way. It will work.

You cannot attach to the Application_Start event in an HttpModule. Here's a list of available events .

I agree with Darin.

the reason being that the application needs to be loaded in order to load modules, so how can you execute code within module before the application is ready to begin loading the module itself?

What are you trying to do? Might be worth evaluating what the idea of your solution looks like :)

Hope this helps :)

I got interested in this thread and how a website started while fixing an bug in an old ASP.NET site.

So I put together a demo, to see how it would work. Seems the order IS from the web.config.

You can see here https://github.com/jradxl/MVC-Website-Without-Global.asax.cs It implements Robert Koritnik solution - thanks

As a matter of fact, there is, and always will be only one instance of specific http module until application pool recycle. And, of course, per w3wp.exe worker of you web application.

In other words, use init method or constructor to do initialisation, preload data etc. ;) and don't use static fields except you need to do locking once requests start firing events your module subscribed to and you need change data your module controls or contains as properties. Anyhow, init method is called on application start.

How does one know whether the Init() with the Lock code will be the first of the modules to get called? Surely other modules might be instantiated first? Isn't that the difference for Global.asax's Application_Start event - that it's guaranteed to be first to be called by design?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM