Search code examples
.netiis-7.5application-start

Call to Application_Start after starting application pool in IIS


I would like to know how can I setup the IIS, or the application if needed, for the next requirement: - When the application pool starts in IIS it should call to Application_Start in Global.asax

I was playing around with applicationHost.config getting the following code:

<applicationPools>
        <add name="mySite" autoStart="true" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
        <applicationPoolDefaults>
            <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="false" />
        </applicationPoolDefaults>
    </applicationPools>

. .

 <site name="mySite" id="2" serverAutoStart="true">
            <application path="/" serviceAutoStartEnabled="true" applicationPool="mySite">
                <virtualDirectory path="/" physicalPath="C:\inetpub\wwwroot\mySite" />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation="127.0.0.1:8080:" />
            </bindings>
        </site>

So far the Application_Start is called only when a request is done.


Solution

  • I just want to supplement what @paul said and agree that I was never able to get what Scott Guthrie said on his blog to fully function. Using:

    <applicationPools>
    
        <add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
    
    </applicationPools>
    

    would get the Application Pool to preload after recycling (as exemplified by seeing the w3wp.exe process reload on recycling the application pool).

    But I never was able to get the second part to work:

    <sites>
    
         <site name="MySite" id="1">
    
              <application path="/" applicationPool="MyAppWorkerProcess" serviceAutoStartEnabled="true" />
    
         </site>
    
    </sites>
    

    This may be because when using serviceAutoStartEnabled using serviceAutoStartProvider is also neccessary and that was just overkill for me since I simply wanted the Global.asax's Application_Start to be initialized.

    Luckily, after reading this post and installing the Application Initialization Module and using this value in the Application configuration instead:

    <sites>
    
         <site name="MySite" id="1">
    
              <application path="/" applicationPool="MyAppWorkerProcess" preloadEnabled="true" />
    
         </site>
    
    </sites>
    

    I was able to see that Application_Start is being invoked during initialization. This turns my 10 second initial web service call into a 750 ms initial web service call. Using preloadEnabled is exactly what I needed. I hope it helps others as well.