[Azure] Migration sur Azure, les précautions à prendre dans votre code

Je désire partager avec vous quelques constats lors d’une migration ou développement sur la plateforme Azure. (Ce post fera l’objet de plusieurs mises à jours)

1. Les DateTime

Si l’application s’appuie fortement sur les dates (par exemple l’activation d’une fonctionnalité pendant X minutes), il est fortement préférable d’utiliser DateTime.UtcNow plutôt que DateTime.Now. D’une façon plus générale, préférez l’utilisation du Coordinated Universal Time aussi bien dans l’application que dans vos procédures stockées.

Pourquoi?

La raison est très simple, le jour où vous n’aurez plus la maitrise sur le déploiement géographique de vos applications (typiquement Azure), vous n’aurez plus la main sur le localtime du serveur. Il se trouve qu’Azure s’appuie sur l’UTC dans tous ses DataCenters.

2. Le Parsing des décimaux

L’éternel casse-tête, virgule ou point? Le système anglo-saxon utilise un point alors que tous les autres systèmes utiliseraient la virgule comme séparateur décimal. Pour ne plus avoir de soucis, définissez d’ores et déjà le système que vous allez utiliser. Dans vos conversions, spécifiez la culture info!

Pourquoi?

Par exemple :

Code Snippet
  1. double.Parse("7,3", CultureInfo.GetCultureInfo("fr-FR"));

Renverra 7.3 dans tous les systèmes quelque soit la culture du serveur alors que

Code Snippet
  1. double.Parse("7,3")

renverra 73 dans les systèmes anglo-saxons et 7.3 dans les autres systèmes!

Or dans Azure on n’est sûr de rien… A priori c’est un système anglo-saxon donc attention!

3. PathTooLongException

Un projet en cours de migration utilise Entreprise Library et les noms d’assembly sont juste trop long, du coup lors de tests en local, je me confronte à un PathTooLongException. Le projet se déployait dans un répertoire du type :

C:\Users\Ronny KWON\AppData\Local\dftmp\s0\deployment(168)

Il existe une astuce pour pouvoir déployer dans un répertoire de notre choix, il suffit d’ajouter la variable système “_CSRUN_STATE_DIRECTORY”, spécifier un répertoire, fermer visual studio et la dev fabric et relancez le tout.

image

4. La configuration

Lors d’une migration, on sera souvent confronté au problème de configuration puisqu’à l’initial, toutes les configurations se retrouvent dans le web.config. Cela signifie que si on souhaite changer un appsetting, il faut redéployer la solution! Or il est possible d’extraire ces appsettings et les renseigner dans le ServiceConfiguration et le ServiceDefinition. Seul hic : la syntaxe est différente

un appsetting c’est :

Code Snippet
  1. <add key="SessionMax" value="60"/>

une configuration Azure ça sera plutôt :

ServiceDefinition ServiceConfiguration
Code Snippet
  1. <Setting name="SessionMax"/>
Code Snippet
  1. <Setting name="SessionMax" value="60"/>

Un travail long et douloureux si les configurations sont nombreuses!

Je vous propose un draft de code qui permet de transformer des appsettings en configuration pour azure (definition + configuration)

Code Snippet
  1. // on récupère les appsettings
  2. string config = AppConfigurationTextBox.Text;
  3.  
  4. if (!String.IsNullOrEmpty(config))
  5. {
  6.     string serviceConfiguration = Regex.Replace(config, "add key", "Setting name");
  7.     string serviceDefinition = Regex.Replace(serviceConfiguration, "value[:b]*=[:b]*\"(.*)\"", "");
  8.  
  9.     ServiceDefinitionTextBox.Text = serviceDefinition;
  10.     ServiceConfigurationTextBox.Text = serviceConfiguration;
  11. }

5. Gérer le double environnement d’exécution de vos applications (Azure & On-Premises)

Garder la possibilité de déployer l’application aussi bien sur Azure que dans un serveur web s’est s’assurer une certaine indépendance vis à vis de la plateforme Azure, une variable permet de détecter l’environnement d’exécution d’Azure :

Code Snippet
  1. RoleEnvironment.IsAvailable

Typiquement, vous pourrez combiner cette variable avec la lecture de configuration par exemple. De ce fait, si l’application s’exécute dans Azure, la configuration de l’application (app settings) pourra être lue dans les ServiceConfiguration et si elle s’exécute dans un serveur web classique, elle pourra lire dans le web.config :

Code Snippet
  1. public static string Get(string key)
  2. {
  3.     if (RoleEnvironment.IsAvailable)
  4.     {
  5.         return RoleEnvironment.GetConfigurationSettingValue(key);
  6.     }
  7.     else
  8.     {
  9.         return ConfigurationManager.AppSettings[key];
  10.     }
  11. }

6. Bug avec Ajax “Specified argument was out of the range of valid values. Paremeter name: utcDate”

Si votre application utilise des composants Ajax, il se peut que vous soyez confrontés au problème suvant :

Code Snippet
  1. <!--
  2. [ArgumentOutOfRangeException]: Specified argument was out of the range of valid values.
  3. Parameter name: utcDate
  4.    at System.Web.HttpCachePolicy.UtcSetLastModified(DateTime utcDate)
  5.    at System.Web.HttpCachePolicy.SetLastModified(DateTime date)
  6.    at System.Web.Handlers.AssemblyResourceLoader.System.Web.IHttpHandler.ProcessRequest(HttpContext context)
  7.    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
  8.    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
  9. -->

Un problème avec le paramètre utcDate serait la cause…

La raison : il se trouve que lors du déploiement de l’application, le package a de fortes chances d’être en avance sur son temps (La France a 2h d’avance sur l’UTC) car il aura été généré sur votre poste en France… Ajax ne doit pas trop aimé ça.

Pour résoudre ce problème, deux solutions.

1) Attendre 2h…

2) comme énoncé sur ce thread, il faut copier tout le contenu CSS de l’AjaxControlToolKit dans votre projet et mettre le build action en Content.

Publié samedi 22 mai 2010 19:45 par ronnyk
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires


Les 10 derniers blogs postés

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le il y a 3 heures et 50 minutes

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le il y a 5 heures et 41 minutes

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le il y a 9 heures et 32 minutes

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le il y a 9 heures et 38 minutes

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le il y a 10 heures et 14 minutes

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29

- AutoSPInstaller pour SharePoint 2013 maintenant disponible en “RTM” par Julien Chable le 05-06-2013, 23:30