Avkash Chauhan's Blog

Windows Azure, Windows 8, Cloud Computing, Big Data and Hadoop: All together at one place.. One problem, One solution at One time...

Dissection of a Windows Azure SDK 1.3 based ASP.NET Web Role in Full IIS mode & HWC

Dissection of a Windows Azure SDK 1.3 based ASP.NET Web Role in Full IIS mode & HWC

  • Comments 1

Let's start from the point that you have an ASP.NET based WebRole as MainWebRole.DLL which you have created using Windows Azure SDK 1.3. The ServiceConfiguration.CSDEF setting can run your webrole in following two modes:


1. Full IIS Mode

2. HWC (Hostable Web Core) Mode


Full IIS Mode:

Let's Start from Full IIS Mode. In this mode you will have your ServiceConfiguration.CSDEF will have a section name <Sites> as below:


<?xml version="1.0" encoding="utf-8"?>

<ServiceDefinition name="AzureVMAssistant" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">

  <WebRole name="MainWebRole">

    <Sites>

      <Site name="Web">

        <Bindings>

          <Binding name="Endpoint1" endpointName="Endpoint1" />

        </Bindings>

      </Site>

    </Sites>

    <Endpoints>

      <InputEndpoint name="Endpoint1" protocol="http" port="80" />

    </Endpoints>

    <Imports>

      <Import moduleName="Diagnostics" />

      <Import moduleName="RemoteAccess" />

      <Import moduleName="RemoteForwarder" />

    </Imports>

  </WebRole>

</ServiceDefinition>



Above highlighted <Sites> part is important as it makes your application to run in Full IIS mode. When you RDP to your Windows Azure VM you will see two processes are handing your service:

1. WaIISHost.exe

2. w3wp.exe


 

If you look for the .net assemblies in both the above process you will see the MainWebRole.DLL is loaded with both the process.

 

WaIISHost.EXE


w3wp.exe



HWC (Hostable Web Core) Mode

In this mode you will have your ServiceConfiguration.CSDEF will MUST have cmmented the <Sites> section as below:


<?xml version="1.0" encoding="utf-8"?>

<ServiceDefinition name="AzureVMAssistant" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">

  <WebRole name="MainWebRole">

    <!--<Sites>

      <Site name="Web">

        <Bindings>

          <Binding name="Endpoint1" endpointName="Endpoint1" />

        </Bindings>

      </Site>

    </Sites>-->

    <Endpoints>

      <InputEndpoint name="Endpoint1" protocol="http" port="80" />

    </Endpoints>

    <Imports>

      <Import moduleName="Diagnostics" />

      <Import moduleName="RemoteAccess" />

      <Import moduleName="RemoteForwarder" />

    </Imports>

  </WebRole>

</ServiceDefinition>



Just making the above change caused your application to run very differently. You will see only one process WaWebHost.EXE is taking care of your application and our MainWebRole.DLL is loaded in this process as below:




Summary:

The gist to understand here that there is a significant difference in how your code is hosted in Windows Azure depending on whether you choose HWC or Full IIS.

As you know that your Web Role have two important pieces:

1. RoleEntryPoint (OnStart method of your WebRole class which derives from RoleEntryPoint)


namespace MainWebRole

{

    public class WebRole : RoleEntryPoint

    {

        public override bool OnStart()

        {

            // For information on handling configuration changes

            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.


            return base.OnStart();

        }

    }

}


2. Your WebSite Content

 

When you have select to use HWC Mode:

       The RoleEntryPoint methods  and your web site itself run under the WaWebHost.exe process.

       In the following diagram you can see how MainWebRole.dll is hosted in WaWebHost.EXE

 

When you have select to use full IIS Mode:

1. RoleEntryPoint runs under WaIISHost.exe,

2. Your web site runs under a normal IIS w3wp.exe process.

       In the following diagram you can see how MainWebRole.dll is hosted in WaIISHost.EXE & w3wp.exe


 

When you decide to upgrade your ASP.NET web role from Windows Azure SDK 1.2 to Windows Azure SDK 1.3, please consider following scenarios as below:

 

1. Configuration Settings in Full IIS Mode:

You will see on common problem with full IIS that code running in RoleEntryPoint cannot read web.config and cause error.

The reason for this problem is that your web site uses web.config as configuration file however RoleEntryPoint does not have access to web.config because RoleEntryPoint code is running in separate process (WaIISHost.exe) then the website (w3wp.exe).

The WaIISHost.exe process looks configuration settings in a file name WaIISHost.exe.config so you will need to create a file name WaIISHost.exe.config with all the necessary settings and place along with your application to avoid such problem.

 

2. Problem accessing Static Members from your Web site and RoleEntryPoint

As RoleEntryPoint and Website is running on two separate processes the static members will not be shared in between these two.



Leave a Comment
  • Please add 3 and 8 and type the answer here:
  • Post
  • Hi Avkash,

    After I upgraded from Azure SDK 1.2 to 1.4 my application's web role cannot access SQL Azure. If I change the csdef file to HWC mode as you explained, it works.

    Now my question is how can I use Full IIS mode and yet access SQL Azure?

Page 1 of 1 (1 items)