Archives de mot-clé : SharePoint

Comment récuperer le code source de vos projets SharePoint perdu à partir d’un WSP?

Introduction

Un de mes collègues a récemment perdu une partie de son code source suite à un problème technique avec un poste virtualisé. Il n’avait pas eu le temps d’archiver le code dans le gestionnaire de code source et tout ce dont il disposait était le code compilé (WSP). Après avoir essayé de recréer sont code à partir de rien, il s’est résolu à venir me voir pour trouver une solution à sont problème.

Dans ce billet nous allons voir comment il est possible de recréer un projet SharePoint à partir d’un fichier WSP et si requis de dé-compiler les DLL d’un projet.

Recréer un projet SharePoint à partir d’un WSP

Pour importer un fichier .wsp

  1. Dans Visual Studio, dans la barre de menus, choisissez Fichier, Nouveau, Projet pour afficher la boîte de dialogue Nouveau projet.  Si votre interface IDE est définie pour utiliser les paramètres de développement Visual Basic, dans la barre de menu cliquez sur Fichier, puis Nouveau Projet.

  2. Développez le nœud SharePoint sous Visual C# ou Visual Basic,

  3. Choisissez le modèle Importer le package de solution SharePoint dans le volet Modèles, puis cliquez sur OK.

    L’Assistant Personnalisation de SharePoint s’affiche.

  4. Dans la page Spécifier le site et le niveau de sécurité pour le débogage, spécifier un site existant.

  5. Dans la section Quel est le niveau de confiance de cette solution SharePoint ?, sélectionner une des deux options.

  6. Dans la page Spécifier la nouvelle source de projet, accédez à l’emplacement du système où vous avez stocké le fichier .wsp, puis cliquez sur le bouton Suivant.

    123012_2133_importingsh6

  7. Dans la zone Sélectionner les éléments à importer, sélectionner tous les éléments que vous voulez récupérer, puis cliquez sur Terminer.

    123012_2133_importingsh8

    Une fois l’opération d’importation terminée, un nouveau projet appelé WspImportProject1 dans lequel figure un dossier nommé Champs est alors créé.  Ce dossier contient les colonnes de site personnalisée.

    123012_2133_importingsh9

Cette opération vous permet de recréer un projet avec les différents artefacts. Cependant, certains éléments comme les DLL peuvent se retrouver dans les « éléments non importés ».

Décompiler les DLL

Ensuite, pour les éléments qui n’ont pas pu être importés, il est possible de dé-compiler les DLL à l’aide d’un outil comme ILSpy ou Reflector :

Capture

Vous pourrez ensuite, extraire le code et recréer vos classes dans votre projet.

Conclusion

Bien évidemment, ça ne permet pas de reproduire exactement le projet dans le même état initial mais on peut tout de même récupérer le code source perdu. Idéalement, pensez à archiver vos sources régulièrement dans votre gestionnaire de code source afin d’éviter de vous retrouver dans cette fâcheuse situation.

Publicités

Aperçu de carrière – Qu’est-ce que je fais en tant qu’architecte organique SharePoint

Il y a plusieurs facteurs à considérer lors de la phase d’analyse et de développement d’une application SharePoint. Quelqu’un doit fournir des directions précises et uniformes sur la façon de faire lorsque les équipes travaillent sur plusieurs applications pour différents clients. Cette personne est l’architecte organique SharePoint et il guide les membres de l’équipe afin que les projets passent d’un concept à une application.

Un architecte organique SharePoint possède alors une large compréhension de SharePoint (pas forcément sur le côté technique) et il a la capacité de lier un problème d’entreprise à la technologie SharePoint.

Voici d’autres capacités dont il dispose :

  • Bonnes compétences de communication, de vulgarisation et de documentation;
  • Les connaissances sur la façon d’intégrer SharePoint avec d’autres systèmes;
  • Une bonne compréhension de ce que SharePoint peut fournir, de ce qui peut être réalisé « out of the box » ou avec de la personnalisation, des types de configurations qui sont disponible et des limites des fonctionnalités

En savoir un peu plus sur moi et mon expérience

Je suis architecte organique SharePoint chez Victrix depuis 2014. Je développe avec la plateforme SharePoint depuis 2010 et avec Microsoft.Net depuis mes tout débuts en 2006.

Que ce soit dans les secteurs privés, gouvernementaux, municipaux, bancaires ou du marketing Internet, j’ai participé à plusieurs grands projets SharePoint au Québec. Parmi ceux-ci, la refonte de l’intranet municipal de Ville de Québec, projet dont j’étais le développeur principal, a reçu le prix de meilleure solution en 2012, lors du Gala d’excellence SharePoint.

Formateur au Cégep de Sainte-Foy entre 2009 et 2012 et depuis 2015 chez Technologia, j’adore partager mon expertise. J’encadre régulièrement des équipes de développeurs SharePoint lors de mes mandats en plus d’alimenter régulièrement mon blogue.

Qu’est-ce qui m’a poussé à choisir ce cheminement de carrière ? 

Lorsque j’ai terminé mes études, j’ai obtenu mon premier emploi en tant que développeur Web .NET et je me suis vite rendu compte que j’étais habile pour réaliser du code ainsi que pour apprendre d’autres technologies par moi-même. À mes tous débuts, je me préoccupais de faire à la lettre ce qui était indiqué dans le document d’analyse. Par la suite, je me suis intéressé à comprendre le besoin réel du client et donner mon avis lors de la phase d’analyse. Puis j’ai été impliqué sur des projets avec la plateforme SharePoint et j’ai été très impressionné par ce que cette boite à outil pouvait m’offrir et ainsi m’éviter de réinventer la roue dans mes projets de développement. Quelques années plus tard à me faire les dents sur cette plateforme, j’ai finalement obtenu un poste d’architecte organique SharePoint. 

Comment ai-je obtenu mon travail? Quel genre de formation et d’expérience j’ai eu besoin?

C’est un collègue d’un emploi antérieur qui m’a référé au travail que j’occupe présentement alors c’est la preuve qu’entretenir un bon réseau de contact est très utile sur la marché du travail. Pour ma part, comme formation, j’ai un DEC en informatique de gestion. Pour devenir architecte organique, il faut tout d’abord faire ses preuves en tant que développeur et cela peut prendre 5 à 10 années d’expériences. Bien que les certifications SharePoint ne sont pas essentielles, elles pourraient vous être utiles pour vous démarquer.  

Quels genres de choses j’effectue au-delà de ce que la plupart des gens voient ?

Beaucoup de nos clients et collègues se tournent vers moi pour des conseils et des idées pour corriger ou améliorer leur application hébergé sur SharePoint. Il m’arrive donc souvent d’effectuer ces choses :

  • Réaliser des preuves de concept;
  • Effectuer la revue de code des autres développeurs;
  • Répondre aux questions complexes reliées de près ou de loin à SharePoint (IIS, ASP.NET, Virtual Directories, AD, etc…)
  • Effectuer des sessions de contrôle à distances;
  • Veiller à ce que le code soit bien stocké dans le gestionnaire de code source;
  • Estimer la durée requise pour des tâches;
  • Effectuer de la veille technologique afin d’être au courant des nouveautés 

Qu’est-ce que je passe la majorité de mon temps à faire ? 

Dans mon poste en ce moment, j’ai la chance de pouvoir réaliser du code au moins 50% de mon temps mais ce n’est pas toujours le cas. Je m’occupe donc des tâches plus complexes et je délègue ce qui est plus simple à d’autres développeurs. 

Qu’elles idées fausses les gens se font souvent à propos de mon travail ? 

LcodeMonkeyes gens pensent parfois que je suis un « code monkey » et que je passe mes journées assis devant un ordinateur. Cependant, on travaille beaucoup en équipe alors il y a une bonne partie de nos journées que l’on consacre à échanger entre collègues et avec nos clients. Alors le mythe est FAUX!

Quelles sont mes heures de travail en moyenne ? 

Je travaille en moyenne 40 heures par semaine et j’ai beaucoup de flexibilité sur mon heure d’arrivé et de départ. Ça varie cependant en fonction des projets en cours que nous avons.  

Quels conseils et raccourcis rendent mon travail plus facile ? 

Il faut tenir ses connaissances à jour et ne pas hésiter à investir sur soi-même si les projets sur lesquels on travail ne le permettent pas. Pour ma part, j’alimente un blog sur mon temps libre, je réponds à des questions sur des forums Technet, je fais beaucoup de veille technologique et j’organise des rencontres pour le groupe d’usagers SharePoint Québec. Tout cela m’aide grandement pour mieux répondre à mes clients et à mes collègues.

Qu’est-ce qui différencie un architecte d’un développeur ? 

À mon avis, l’architecte est responsable de la qualité technique globale alors que le développeur s’occupe plutôt des sections qu’il doit réaliser. De plus, l’architecte dois avoir une bonne vision de la solution avant que celle-ci soit réalisé en plus d’agir comme un leader auprès de ses coéquipier.

Quels conseils je donnerais à ceux qui aspirent à rejoindre ma profession? 

Comme je le disais à une question précédente, il ne faut pas hésiter à investir sur soi-même et pas seulement sur le côté technique. Vos softskills comme la communication et la débrouillardise sont aussi très importante à développer.

Cheat sheet pour les développeurs SharePoint

Introduction

Règle générale, je vous propose des billets sur des problèmes rencontrés lors de mes expériences avec SharePoint. Cette fois-ci, je vous propose quelque chose de différent avec une Cheat Sheet spécifique pour les développeurs SharePoint. Le concept de Cheat Sheet existe depuis longtemps et présente généralement de la façon la plus concise possible, les grandes lignes d’un logiciel ou d’un langage informatique.

Pourquoi une Cheat Sheet ?

Lorsqu’on forme des développeurs SharePoint, on a beau leurs donner plusieurs trucs, il y a tellement de chose à savoir que souvent ils ont de la difficulté à retrouver toute l’information qu’ils recherchent.

C’est alors qu’on se fait poser plusieurs questions du genre :

  • Quel est le Token pour avoir le URL de la collection de site dans un Custom Action?
  • Comment je peux éviter d’hardcoder le URL absolue de mon site SharePoint?
  • Comment je peux récupérer le GUID de ma liste?
  • Comment je peux supprimer une WebPart qui a brisé ma page?
  • Comment je peux afficher un formulaire dans une boite de dialogue?
  • etc…

Si vous vous posez souvent ce genre de question, je vous inviter a télécharger et imprimer ma cheat Sheet.

telecharger-bouton

Voici un bref aperçu :

cheetSheetPreviewEffect

N’hésiter pas à commenter si vous avez des suggestions!

Créer un message d’attente pour un traitement long dans SharePoint

Dans ce billet, je vais vous expliquer comment on peut afficher un message d’attente lorsqu’on vous avez un traitement long à exécuter dans SharePoint. J’utilise l’API de SharePoint afin de ne pas réinventer la roue. De plus, ça permet de rester uniforme avec l’ensemble de la plateforme si notre message d’attente à le même aspect visuel partout.

Par défaut, le message de chargement ressemble à ceci :

WorkingOnIt

On peut faire afficher cette fenêtre en utilisant le code JavaScript suivant :

 

SP.UI.ModalDialog.showWaitScreenWithNoClose(SP.Res.dialogLoading15);

Bien sûr, on peut rendre l’expérience utilisateur plus conviviale en affichant un message de chargement personnalisé.

custom

Il suffit d’appeler la même méthode mais cette fois-ci en spécifiant deux paramètres supplémentaires pour modifier les messages affichés.

 

SP.UI.ModalDialog.showWaitScreenWithNoClose('Loading', 'Custom message');

 

Maintenant comment peut-on intégrer ce code JavaScript dans un bouton avec du code serveur ?

Tout d’abord, dans un formulaire vous vous ajoutez un bouton avec un appel à une fonction « btnSoumettre_Click » sur l’événement serveur « OnClick ». Cette fonction nous servira comme une poignée pour fermer le message d’attente lorsque le traitement long sera terminé. Ensuite, on ajoute un appel au message d’attente comme vu précédemment. Bien sûr on peut mettre le code du OnClientClick dans une fonction réutilisable mais pour des raisons de simplicité de l’exemple je ne l’ai pas fait.

<asp:button ID="btnSoumettre" runat="server" Text="Soumettre" OnClick="btnSoumettre_Click" OnClientClick="javascript:SP.UI.ModalDialog.showWaitScreenWithNoClose('Veuillez patienter', 'Le formulaire est en cours d`enregistrement'); />

Finalement dans le code behind de votre formulaire personnalisé on ajoute le code suivant pour la fonction « btnSoumettre_Click ». Tout de suite après votre traitement long, ce bout de code se chargera de fermer la fenêtre de chargement.

//Insérer traitement long...

this.ClientScript.RegisterStartupScript(this.GetType(), "CloseWaitDialog", @"
<script language='javascript'>
if (window.frameElement != null) {
   if (window.parent.waitDialog != null) {
       window.parent.waitDialog.close();
   }
}
</script>");

En conclusion, c’est « Out of the box » alors c’est à mon avis l’option à privilégier au lieu de développer un « spinner » de chargement personnalisé.

Comment créer un service Web WCF (REST) personnalisé dans SharePoint 2013

Récemment, un collègue m’a demandé comment faire pour exécuter du code serveur dans un bouton du ruban. Je lui avait alors répondu : Le plus simple c’est de te faire une page aspx avec une WebPart contenant du code serveur. C’est comme si tu appelais un service web mais au lieu de cela c’est une page aspx avec des paramètres dans le querystring.

Ex : Lors du clique sur un bouton du ruban on appel une page avec des paramètres pour effectuer la modification d’un élément. Assumons que la page se nomme ModifierElement.aspx, alors il sera possible d’y accéder seulement à partir de sont chemin fixe : http://serveur/sites/site/web/pages/ModifierElement.aspx?Id=1

Dans le code du ruban (CustomAction), on peut seulement utiliser du code JavaScript (CSOM) et pour utiliser du code serveur on doit invoquer un événement via le bouton. Ces deux dernières méthodes comportent un certain niveau de complexité ainsi que des limitations.

L’approche de la page aspx est souvent utilisé pour sauver du temps lors du développement. Cependant, après quelques recherches je suis tombé sur une meilleure façon d’exécuter du code serveur en utilisant un Service Web WCF (REST) personnalisé hébergé dans SharePoint.

Comment faire un service Web (WCF) personnalisé ?

Les services Web natif de SharePoint peuvent être accédés à partir du chemin _vti_bin.  Lorsque l’on va développer notre service Web personnalisé il sera accessible via ce même chemin.

Ex : Assumons que le service Web personnalisé se nomme Service.svc alors il sera possible d’y accéder, entre autres, à partir des chemins suivants :

* C’est un avantage comparativement à la méthode de la page contenant une WebPart 

Étape 1 – Créer un projet Visual Studio 2012

  • Créer un nouveau projet à partir du modèle « SharePoint 2013 – Empty Project »
  • Nommer le projet « POC.SharePoint.WebServiceHelloWord »
  • Sélectionner « Deploy as a farm solution »

Étape 2 – Ajouter les références

  • Ajouter les références suivantes dans votre projet : Microsoft.SharePoint.Client.ServerRuntime 15.0.0.0 et System.ServiceModel 4.0.0.0

referenceWcf

Étape 3 – Ajouter un SharePoint Mapped Folder (ISAPI)

Le dossier ISAPI est le dossier spécial dans la « hive » SharePoint où tous les services WCF doivent être déployés. Ce dossier est associé au chemin « _vti_bin » dans IIS et ainsi les services déployés dans ce dossier peuvent être accédé par ce URL : http://serveur/_vti_bin/{NomService}.svc

Pour ajouter un nouveau Mapped Folder on sélectionne le projet et ensuitie on clique de droit -> ajouter -> SharePoint Mapped Folder :

mappedFolderWcf

Ensuite sélectionner le dossier ISAPI :

isapiWcf

C’est une bonne pratique de se créer un sous dossier spécifique à votre projet e.g.: « WebServiceHelloWord » .

Étape 4 – Définir le Service, le Contract et l’Interface

Dans le Mapped Folder « ISAPI » ajouter les fichiers suivants :

  • un fichier texte nommé « Service.svc » (Fichier du service lui même qui sera déployé dans le hive de SharePoint et qui sera appelé dans IIS)
  • un fichier Interface nommé « IService.cs » (Fichier contenant le contrat d’opération du service)
  • un fichier Classe nommé « Service.svc.cs » (Fichier contenant l’implémentation de l’interface du service)

Étape 5 – Définir le contenu du Service, du Contract et de l’Interface

Ouvrez le fichier Service.svc.cs et y insérer le code suivant :

using Microsoft.SharePoint.Client.Services;
using System.ServiceModel.Activation;

namespace POC.SharePoint.WebServiceHelloWord.ISAPI.WebServiceHelloWord
{
 [BasicHttpBindingServiceMetadataExchangeEndpoint]
 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
 public class Service : IService
 {
 public string HelloWorld()
 {
 return "Hello World de mon service WCF dans SharePoint 2013";
 }
 }
}

Ouvrir le fichier IService.cs et y insérer le code suivant :

using System.ServiceModel;

namespace POC.SharePoint.WebServiceHelloWord.ISAPI.WebServiceHelloWord
{
 [ServiceContract]
 public interface IService
 {
 [OperationContract]
 string HelloWorld();
 }
}

Ouvrir le fichier Service.svc et y insérer le code suivant :

<%@ ServiceHost Language="C#" Debug="true"
 Service="POC.SharePoint.WebServiceHelloWord.ISAPI.WebServiceHelloWord.Service, $SharePoint.Project.AssemblyFullName$"
 CodeBehind="Service.svc.cs"
 Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory,
 Microsoft.SharePoint.Client.ServerRuntime,
 Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

Étape 6 – Permettre à VS d’effectuer le remplacement des tokens dans un fichier *.svc

Dans le code du dernier fichier Service.svc qu’on a ajouté il y a une ligne contenant un jeton de remplacement (Token) : $SharePoint.Project.AssemblyFullName$

Si on ne fait rien on aura une erreur lors de la compilation. Il y a plusieurs façon de s’y prendre mais à mon avis la façon la plus élégante est de permettre à VS d’effectuer le remplacement de ces tokens pour les fichiers « *.svc ». J’appel cette technique la passe du coyote qui tousse!

Pour s’y faire, on doit effectuer un « Unload Projet » et ensuite un « Edit {NomDuProjet}.csproj ».

Ensuite trouver la ligne suivante :

<SandboxedSolution>False</SandboxedSolution>

Après cette ligne ajouter celle-ci :

<TokenReplacementFileExtensions>svc</TokenReplacementFileExtensions>

Sauvegarder le fichier et faire un « Reload project ».

Étape 7 – Compiler, déployer et tester le service WCF (REST) personnalisé

Une fois que vous aurez compilé et déployé votre service, vous pourrez le tester directement par son URL : http://serveur/_vti_bin/WebServiceHelloWord/Service.svc

testWcf

Cliquez ici pour télécharger le code source

Autres cas d’utilisations

Bien évidemment, le message retourné par notre fonction « HelloWorld » ne nous apporte rien de concret mais voici quelques exemples d’utilisation que l’on peut faire avec un service Web WCF (REST) personnalisé dans SharePoint :

  • Modifier les métadonnées d’un document (Ex: Ajouter un préfixe)
  • Exporter un rapport personnalisé en PDF
  • Modifier la sécurité d’un élément
  • Envoyer un document en pièce jointe d’un courriel
  • etc…

Conclusion

Utiliser un service Web WCF (REST) personnalisé dans SharePoint comporte plusieurs avantages comparativement à utiliser une page « aspx » avec une WebPart. D’une part, le service est accessible plus facilement via « _vti_bin » dans tout les sites et lorsqu’on utilise un service web WCF on envoie seulement le XML nécessaire au lieu d’envoyer tout le contenu HTML d’une page « aspx ».

Masquer ou ne pas masquer le ruban dans SharePoint, telle est la question

Lorsqu’on parle du ruban on parle bien sur de cette barre d’outil qui s’affiche par défaut dans le haut de chaque page dans SharePoint. SharePoint introduit le ruban pour aider les utilisateurs à accomplir leurs tâches. L’une des idées derrière le ruban, c’est qu’il soit toujours à la portée de sorte que les utilisateurs peuvent facilement découvrir les fonctionnalités dont ils ont besoin à un moment donné. Voici un aperçu du ruban (SharePoint 2010) :

rubban1

Lorsque viens le temps de personnaliser l’aspect visuel d’un site SharePoint les designeurs web ont tendance à exclure le ruban de leurs maquettes. Pourquoi ? C’est fort simple, ce sont souvent des firmes de design externe qui sont mandaté pour faire les maquettes de site SharePoint et celle ayant SharePoint dans leur portefolio sont peu nombreuse. Ils n’aiment pas que leur créativité soit brimé et ils ne sont pas très chaud à l’idée d’avoir une barre de boutons dans le haut en permanence.

Sites de publication

Ils ont un bon point, dans la mesure où l’ont veut créer une maquette pour un site de publication et que la majorité des utilisateurs n’effectuent pas de modification au contenu alors le ruban n’est pas un pré-requis. Il faut tout de même prévoir un mécanisme facile pour afficher le ruban afin que les super-utilisateurs puissent modifier leurs pages.

Sites de collaboration

Cependant, dans un site de collaboration, je considère que c’est une problématique de masquer le ruban car on enlève l’accès facile aux fonctionnalités contextuel.

Récente SharePointerie avec le ruban

J’ai récemment eu à intervenir sur une problématique relié au ruban dans un site d’équipe chez un client. Leur ruban était masqué par défaut de manière temporaire dans la page maitre et il était possible de l’afficher à l’aide d’un bouton « Afficher le ruban / Masquer le ruban ». Bien évidemment, c’est après plusieurs heures de débogage de JavaScript que je me suis rendu compte de la cause du problèmes.

Problématique / symptômes :

Lorsqu’on utilise le menu contextuel dans une bibliothèque de documents d’un site d’équipe et qu’ensuite on affiche le ruban, les boutons du ruban ne fonctionnent plus.

Cause du problème :

Dans une bibliothèque de documents lorsqu’on navigue dans un dossier SharePoint met l’onglet « Document » par défaut mais il n’y arrive pas à le faire si le ruban est masqué (Par la page maître).
Détails technique :

J’ai testé avec la page maitre par défaut et bien évidemment je n’avais pas le problème car le ruban est visible par défaut. Ensuite, c’est en analysant les URL des bibliothèques que je me suis rendu compte qu’en enlevant le paramètre « InitialTabId » le ruban fonctionnait à nouveau.

Ex : http://UrlDuSite/NomBibliotheque/Forms/AllItems.aspx?RootFolder=NomDuDossier&FolderCTID=LeGuidDuDossier&InitialTabId=Ribbon%2EDocument

Par défaut lorsqu’on navigue dans un « dossier » d’une bibliothèque de document le paramètre « InitialTabId » est ajouté dans le URL.

Solution :

Cesser de masquer le ruban par défaut dans la page maitre.

Meilleures pratiques

Comme les meilleures pratiques le suggère, vous n’êtes pas censé cacher le ruban de manière permanente puisque la plupart des fonctionnalités de SharePoint sont accessibles par ruban facilement. Si malgré tout, vous voulez le masquer de manière temporaire, soyez à l’affut des éventuelles problématiques.

Conclusion

En bref, je ne vous recommande de ne pas masquer le ruban dans un site de collaboration car ceci peut occasionner des erreurs telles que démontré dans la SharePointerie ici-haut. En plus de cela,  ça peut créer des incohérences si un comportement est différent entre les utilisateurs et les super-utilisateurs. Cependant, pour un site de publication qui serait modifié par quelques utilisateurs c’est très envisageable de le masquer pour avoir un visuel avec du tape à l’œil.