简体   繁体   中英

Application_start not working

I have written some code in the application_start() method in my global.asax file. It does not get called when I deploy my application on IIS server. The code is accessible when I run it in the .NET framework.

I've tried to restart the application many times, but it's still not working.

I've also tried the suggestion from the following link.

Application_Start not firing?

There are few things you need to know before you are trying to debug Appplication_Start . There are -

One : When the code executes and why it is almost impossible to debug by attaching to it.

The application start method is executed when the application pool starts and your website is being started up for the first time. If you deploy new deliverables to IIS, then IIS might restart it itself, but there is no guarantee that it will. So, deploying new codes does not guarantee that it will restart the pool and he execution of application start. You should restart your application pool to guarantee execution of application start.

While debugging IIS applications, Visual Studio attaches itself to a process something named w3wp.exe or similart (I forgot the actual executable name), which is the worker process and only available after, remember after, your application pool is up and your site is up. So, in other words, if you are seeing this in service list, then the application start has already been executed and attaching to it will not give you a chance to debug it. It is kind of a tug of war with time.

So, in other words, it is kind of impossible to debug application start unless you are very very quick.

Two, the solution 1 - With Dev Server

Launch your application in visual studio with Asp.net development server or IIS express, then you will be able to debug. But if you really want to debug on IIS, then check the next section

Two, the solution 2 - With IIS

There is a library in the name System.Diagnostics , Debugger and it has a nice way to call debugger in code. You can read it here - http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.break(v=vs.110).aspx

Modify you application start with this -

public void Application_Start(){
    ....... //other codes
    Debugger.Break() or Debugger.Launch()
}

When this line executes, IIS will halt execution, and will show you a debugger selector window (similar to the one attached)在此处输入图片说明 , keep your solution open in vs and select that vs from the list, will be able to debug as usual... :)

In case you are using windows 8 and the debugger does not launch, read this article to enable it -

http://blogs.msdn.com/b/mapo/archive/2013/11/07/debugger-launch-not-displaying-jit-debugger-selection-popup-on-windows-8-8-1.aspx

Three: A very important thing

I noticed that you said, you are adding db entries in Application_Start. You should keep in mind that, Application_Start does not have a HttpContext , ViewContext , So your db access code may fail for so many others reasons.

Make sure that the Global.asax file is actually deployed to the destination folder in the root. If the file is not present then the code behind you have written for Application_Start will never be called.

Also make sure the signature is correct

public class Global : System.Web.HttpApplication {
   protected void Application_Start(object sender, EventArgs e) {/*do something here like logging so you know it was called*/}
}

If you are running Server 2008R2 (or earlier) and/or IIS 7.5, you might want to look into the Application Initialization module. This can be downloaded here:

www.iis.net/downloads/microsoft/application-initialization

With IIS versions prior to 8.0, the application start is not called until the first web request arrives. I'm reading your question as you want your application start to be fired before the first web request, yes?

Here is a fantastic guide to configuring this module (if it applies to you): https://blogs.msdn.microsoft.com/benjaminperkins/2014/01/07/configure-the-iis-application-initialization-module/

The key takeaways is that you need to set your app pool to 'AlwaysRunning' instead of 'OnDemand'. You also need to set a preloadEnabled flag for your website. Once both of these are done, fire off an iisreset and you should see the results of your application start (look in the database since it's writing there).

Other answers are relevant as well, in that this is tough to debug and you're missing all the niceties you're used to such as a httpcontext in app start.

If you are running IIS 8.0 - you should still read the above link to configure preloading.

This did work for me:

  • Menu -> Build -> Clean Solution
  • Menu -> Build -> Rebuild Solution

Then, Application_Start() was fired only for the first time.

在我的情况下,在生产环境中 App_global.asax.compiled 丢失,并且 global.asax 的所有内容都没有被触发。

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