Web roles under IIS Classic pipeline mode for backward compatibility
If you have been involved in moving ASP.NET 2.0 Web applications to Windows Azure, you probably have faced some compatibility issues related with the IIS Pipeline mode used by default in a web role.
Windows Azure by default uses integrated mode, but for the sake of simplicity, in some migration scenarios, you could also use Classic mode, that will give you the chance to keep your components as they are.
In order to do that, follow the next steps:
You need to add a reference to the library Microsoft.Web.Administration.dll
You need to override the OnStart event and add the following code:
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports Microsoft.WindowsAzure
Imports Microsoft.WindowsAzure.Diagnostics
Imports Microsoft.WindowsAzure.ServiceRuntime
Imports Microsoft.Web.Administration
Public Class WebRole
Inherits RoleEntryPoint
Public Overrides Function OnStart() As Boolean
'Configure Azure Tracing
ConfigureTracing()
'Configure Azure Pipeline
SetClassicIISPipelineMode()
Return MyBase.OnStart()
End Function
''' <summary>
''' Set IIS Pipeline mode to Classic
''' Only use that method when the app needs backward compatibility
''' </summary>
''' <remarks></remarks>
Private Sub SetClassicIISPipelineMode()
Dim srvManager As New ServerManager()
Try
Trace.WriteLine("SetClassicIISPipelineMode starting...")
Dim appSite = (From site In srvManager.Sites
Where site.Name.Contains(RoleEnvironment.CurrentRoleInstance.Role.Name)).FirstOrDefault()
If Not appSite Is Nothing Then
Trace.WriteLine("AppSite reference retreived")
Dim appPool = (From pool In srvManager.ApplicationPools
Where pool.Name = appSite.Applications(0).ApplicationPoolName).FirstOrDefault()
If (Not appPool Is Nothing) Then
Trace.WriteLine("AppPool reference retreived. Changing mode...")
appPool.ManagedPipelineMode = ManagedPipelineMode.Classic
srvManager.CommitChanges()
Trace.WriteLine("Changes Commited")
End If
Else
Trace.WriteLine("Unable to get AppSite reference")
End If
Catch ex As Exception
Trace.WriteLine("SetClassicIISPipelineMode Exception: " + ex.ToString())
Finally
srvManager.Dispose()
End Try
End Sub
Private Sub ConfigureTracing()
System.Diagnostics.Trace.Listeners.Add(New Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener())
'The Config is Done using the diagnostics.wadcfg file
End Sub
End Class
And that's it, after these changes, your application will run under IIS classic pipeline mode and you won't have to modify any of your components based on classic pipeline mode.
Comments
Anonymous
September 28, 2011
Hello Gonzalo, I have tried above code but its not working. The pipeline is still set to integrated mode. Can you upload sample project achieving the same result Regards ShashankAnonymous
September 28, 2011
Hello Gonzalo, I have tried above code but its not working. The pipeline is still set to integrated mode. Can you upload sample project achieving the same result Regards ShashankAnonymous
October 02, 2011
Hi Shashank , Please be sure that you are deploying to the Management library. Also if you are using multi-sites the following code may change : Dim appSite = (From site In srvManager.Sites Where site.Name.Contains(RoleEnvironment.CurrentRoleInstance.Role.Name)).FirstOrDefault() If you debug the code in the devfabric, are you seeing any error ? Does it work in the Dev Fabric? Regads. Gonzalo.