I found the following answer on forums.asp.net:
Are you using IIS7 as the server or the built-in web server? I noticed when using IIS7 that if you start the debugger, let a page come up, then change Global.asax (the markup file, not code-behind) while the debugger is still running, then refresh the page, breakpoints in Application_Start will be hit.
I think what’s happening is that pressing “play”, VS just fires up the process, then attaches to it, but by the time it attaches to it the start event has already run. By changing Global.asax, you cause the app to restart and since the debugger’s already attached you can hit the breakpoint. Not a great solution, but it seems to work.
Thats’s what was happening in my case.