ReportViewer 2010 lentezza al primo rendering

Da qualche giorno sto analizzando un problema spinoso di lentezza di alcuni applicativi .NET scritti in Visual Studio 2010 che utilizzano gli oggetti ReportViewer per gestire le stampe.

Il problema è stato rilevato su un server RDS, ma in realtà sebbene in RDP vi siano i effetti stati dei problemi con applicativi .NET risolti da hotfix non era questo il caso (si veda ad esempio la KB 2768741 Visual elements are displayed incorrectly when you connect to a computer that is running Windows 7 or Windows Server 2008 R2 by using the Remote Desktop Protocol)

Il problema era invece legato al fatto che il server RDS non aveva la possibilità di accedere nelle sessioni utente a HTTP e HTTPS, scelta assolutamente corretta dal punto di vista della sicurezza dal momento che gli utenti durante le loro sessioni RDP non hanno alcuna necessità di navigare.

Analizzando il traffico in uscita dal server RDS durante l’avvio di tali applicazioni venivano infatti registrate delle chiamate HTTP verso IP relativi a server Akamai Technologies, azienda con cui Microsoft ha stretto un accordo il 27 Settembre del 1999 per utilizzare la rete Akamai al fine distribuire contenuti (a riguardo si veda Microsoft and Akamai Form Strategic Relationship To Enhance Internet Content Delivery)

Provando temporaneamente a concedere l’accesso via HTTP e HTTPS al server RDS analizzando le sessioni sul firewall ho notato che venivano controllati e scaricati dei certificati digitali, dopo il download di tali certificati le applicazioni non presentavano più il problema di lentezza all’avvio.

Nello specifico tale controllo e download di certificati veniva eseguito durante la new dell’oggetto Microsoft.ReportViewer.WinForms.LocalReport.

In effetti la problematicha è in realtà dovuta al framework .NET 2.0 ed è descritta nella KB936707 FIX: A .NET Framework 2.0 managed application that has an Authenticode signature takes longer than usual to start:

SYMPTOMS

When you start a Microsoft .NET Framework 2.0 managed application that has a Microsoft Authenticode signature, the .NET Framework 2.0 managed application takes longer than usual to start.

CAUSE

This problem occurs because a .NET Framework 2.0 managed assembly that has an Authenticode signature takes longer than usual to load. The signature is always verified when the .NET Framework 2.0 managed assembly that has an Authenticode signature is loaded.

Additionally, the .NET Framework 2.0 managed assembly may take longer than usual to load because of various other settings. For example, the .NET Framework 2.0 managed assembly may take longer than usual to load because of the network configuration.

Per evitare questo comportamento è possibile installare l’hotfix richiedendolo servizio supporto tecnico clienti Microsoft oppure installare il framework Microsoft .NET Framework 3.0 e poi disabilitare la verifica della firma digitale tramite una configurazione nell’application configuration file:

This hotfix adds the generatePublisherEvidence configuration setting to the .NET Framework 2.0. After you apply this hotfix, you can use this configuration setting to disable signature verification in a .NET Framework 2.0 managed application. You can use this configuration setting in an application configuration file. To do this, add the following code to the <ApplicationName>.exe.config file for the .NET Framework 2.0 managed application:

<configuration>
    <runtime>
       <generatePublisherEvidence enabled=”false”/>
    </runtime>
</configuration>

If your application is hosted in IIS, change one of the following:

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet.config
  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config

Note On x64 machines, you must also change one of the following:

  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet.config
  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\machine.config

Note Because of how no-touch deployment assemblies are loaded, this configuration setting does not work in no-touch deployment scenarios.

When you disable signature verification, the .NET Framework 2.0 managed application starts faster.

Note When you disable signature verification, the .NET Framework 2.0 managed application no longer receives publisher evidence. This behavior affects the .NET Framework 2.0 managed application only when you use publisher evidence or when you use the PublisherIdentityPermission class.

The generatePublisherEvidence configuration setting will be available in the version of the .NET Framework that follows the Microsoft .NET Framework 3.0.

To create an application configuration file that contains this configuration setting, follow these steps:

  1. Create a file, and then name the file the <ApplicationName>.exe.config file.
  2. In a text editor, open the file that you created in step 1.
    Add the following code to the file.
    <?xml version=”1.0″ encoding=”utf-8″?>
    <configuration>
        <runtime>
           <generatePublisherEvidence enabled=”false”/>
        </runtime>
    </configuration>
  3. Save the changes to the file.

Si noti che disabilitazione di questa funzionalità come specificato non permette più di ricevere il publisher evidence, quindi va valuta nel caso venga usata questa funzionalità di sicurezza nell’applicazione.

Per ulteriori informazioni si vedano anche:

Si noti che questa problematica di lentezza potrebbe affiggere anche Exchange 2007 (infatti nel seguente Come installare il Service Pack o l’aggiornamento cumulativo più recente per Exchange 2007 viene suggerito di istallare tale KB) e SharePoint (a riguardo si veda How To: Make Sharepoint Faster).