Windows Azure Worker Roles et VIP swap

Comme vous devez sûrement déjà le savoir, il n’est pas possible de basculer l’exécution d’une Worker Role entre les slots de Staging et de Production uniquement avec les variables environnementales de Windows Azure.

J’ai donc fait un exemple simple pour permettre à des Worker Roles déployés d’éviter de tourner en concurrent, et ainsi permettre ne de faire tourner un Worker Role que lorsque celui-ci est basculé sur un slot de Production.

Ceci se fait à l’aide de valeurs stockée dans une Table du Table Storage:

  • une entrée par « Version » de » Work Role, pour spécifier aux rôles quelle version doit tourner,
  • une entrée « Globale » pour empêcher la totalité des rôles de fonctionner (exemple : pour mettre à jour un schéma de base de données entre 2 versions).

Dans le cas d’un changement de schéma en base de données, voici quelques slides illustrant le fonctionnement de la solution :

:

Voici le code du projet  que j’ai fait à ce titre,et que vous pouvez réutiliser à souhait pour couvrir ce cas.

Happy coding!

SharePoint 2010 – 2013 Résultats de recherche filtrés avec des claims

J’ai travaillé récemment sur la recherche avec Sharepoint 2013, avec un cas que de nombreux client peuvent avoir à traiter:

  •  SharePoint est accédé depuis des points d’accès internes et externes, mais les données internes doivent uniquement être trouvables lorsque qu’un utilisateur est connecté au réseau interne (Ferme interne non accessible depuis la DMZ).
  • ADFS est utilisé pour authentifier les utilisateur internes (client Certificates) et externes (Form-based authentication).
  • ADFS est aussi utilisé pour augmenter les claims données à SahrePoint avec une claim  »AccessLocation » contenant la valeur « Internal » ou « External ».

Continue reading

Résoudre l’accès aux ressources distantes (images) avec ADFS 2.0 et SharePoint 2013 People Search

Dans un environnement SharePoint 2013 utilisant les claims, vous utlisiez probablement des Web Applications Web Applications différentes pour :

Dans un tel scénario, ce que vous allez trouver sur la page de recherche des utilisateurs, ce sont de images qui ne sont pas chargées:

NoUserImage

Ceci se produit car l’authentification ADFS a bien été effectuée sur le site de Search, mais pas sur le site contenant le User Profile. Une requête HTTP seule depuis le site de Search n’est en effet pas capable de gérer l’aller-retour nécessaire pour autentifier l’utilisateur avec des claims.

Il y a de nombreuses solutions pour résoudre ce problème ; ma solution préférée est de forcer l’accès à la Web Application contenant les images à l’aide d’une iFrame, et d’être ensuite notifié par un « PostMessage » depuis l’iFrame pour initier le rechargement des images dans la fenêtre parente.

Continue reading

Windows 8.1 : attentes

Maintenant que Windows 8.1 est annoncé, à quoi pouvons-nous nous attendre ?

Voici ce que je pense faire partie de la nouvelle version de Windows 8.1:

  • Beaucoup de nouvelles APIs : Windows 8 manque de certaines simplifications dans son développement, qui devraient être enrichies de nombreux nouveaux ajouts,
  • De nouvelles tailles de tuiles: comme l’a fait Windows Phone 8, un nouveau set de tailles tuiles pour enrichir encore plus l’interface de Windows 8.1,
  • Performance : comme toute nouvelle version de système, une mise à jour vient aussi avec son lot d’améliorations, surout en ce qui concerne la partie Modern UI, qui est assez récente comparé au noyau de Windows lui-même.

Nous verrons bien d’ici quelques jours !

{« Message »: »An error has occurred. »} en déployant votre site web Windows Azure

Je travaillais ces jours-ci sur le déploiement de quelques sites développés sur MVC4 API Web, en utilisant Entity Framework avec les types spatiaux (types Geometry et Geopraphy).

Tout allait bien sur ma machine de dev, mais cela ne fonctionnait as en déployant ma solution sur Azure.

La plupart de mes appels WebAPIs me donnaient comme erreur: {« message »: « An error has occurred. »}

Cela provient d’une assembly manquante dans les binaires qui sont déployés avec votre site.

Il suffit d’ouvrir votre gestionnaire de packages Nuget, de chercher le package  »Microsoft.SqlServer.Types » et de l’ajouter à votre projet.

Tada :)

Faites que le titre de vos webparts soit localisable

Dans de nombreux projets traitant de localisation, j’ai du localiser le contenu de WebParts, de User Controls ou d’Application Pages, et SharePoint 2010 au travers des APIs de ASP.NET le permet assez bien.

Mais pour localiser le titre d’une WebPart, là… Il n’y a pas vraiment de solution toute faite.

J’ai donc pris mes petites mains et j’ai écrit une joli classe abstraite, qui flanquée de quelques classes helper me permet de faire ceci; il me suffit tout simplement d’hériter de ma nouvelle classe LocalizableWebPart et le tour est joué !

Une fois la webpart héritée, il suffit de changer l’héritagede ses WebParts customs de WebPart en LocalizableWebPart.

Pour exemple, le code de cette classe:

public abstract class LocalizableTitleWebPart : WebPart
{
    [WebPartStorage(Storage = Storage.Shared)]
    public string LocalizedTitle { get; set; }

    private LangageContainer langContainer = null;

    protected string GetLocalizedProperty(LangageContainer container, string content)
    {
        if (container != null)
        {
            return container.GetOrInsertLanguage().EncodedLanguageContent;
        }
        else
        {
            container = LocalizationHelper.GetLanguagesContent(content);
            return container.GetOrInsertLanguage().EncodedLanguageContent;
        }
    }

    protected string SetLocalizedProperty(LangageContainer container, string content, string value)
    {
        container = LocalizationHelper.GetLanguagesContent(content);
        var lang = container.GetOrInsertLanguage();

        if (this.Page != null && this.Page.IsPostBack)
        {
            container.UpdateLanguage(lang.LanguageCode, value);
            return LangageContainer.Serialize(container);
        }
        return content;
    }

    public override string Title
    {
        get
        {
            return GetLocalizedProperty(langContainer, this.LocalizedTitle);
        }
        set
        {
            this.LocalizedTitle = SetLocalizedProperty(langContainer, this.LocalizedTitle, value);
        }
    }
}

Ce que vous pouvez voir dans le code au dessus:

  • une propriété WebPart automatiquement persistée qui stocke le contenu des langues du titre en XML,
  • deux méthodes pour récupérer et sauvegarder la valeur de la langue courante.

Vous pouvez trouver le code de cette classe avec un exemple de WebPart dans le repo Git suivant:

https://github.com/JaYmZ666/localizableTitleWebPart

Happy coding!

Rejoignez-nous aux Techdays 2013 à Lausanne !

Cher visiteur,

Cette année, les Microsoft Techdays se tiendront Conrès Beaulieu à Lausanne, du 6 au 7th novembre.

Yves Peneveyre et moi même vous présenteront une session autour de la gestion de contenu web avec SharePoint 2013.

Je serai présent sur le stand de CTP pour ceux qui souhaiteraient aborder plus longuement les sujets de notre sessions ou encore tout ce qui touche au Cloud Computing :)

Au plaisir de vous rencontrer là-bas !