C# : Exécuter un batch et récupérer la sortie.


private int Run_Batch(string sBatchPath, string sBatchName, string sArgs)
{
	// Code retour du batch
    int iExitCode = 0;
    // Chemin complet du batch
    string sBatchFullPath = sBatchPath + "\" + sBatchName;
    // Configuration du batch (chemin, arguments, sorties...)
    ProcessStartInfo processInfo = new ProcessStartInfo(sBatchFullPath);
    processInfo.CreateNoWindow = true;
    processInfo.Arguments = sArgs;
    processInfo.RedirectStandardOutput = true;
    processInfo.RedirectStandardError = true;
    processInfo.UseShellExecute = false;
    // Process en soi
    Process pBatch = new Process();
    // Redirection de la sortie vers une fonction
    pBatch.OutputDataReceived += new DataReceivedEventHandler(pBatch_OutputDataReceived);
    pBatch.StartInfo = processInfo;
    pBatch.EnableRaisingEvents = true;
    // Démarrage du batch + lecture des sorties.
    pBatch.Start();
    pBatch.BeginOutputReadLine();
    pBatch.BeginErrorReadLine();
    // Synchronisation
    pBatch.WaitForExit();
    iExitCode = pBatch.ExitCode;
    // Fermeture
    pBatch.Close();
    return iExitCode;
}
protected void pBatch_OutputDataReceived(Object sender, DataReceivedEventArgs e)
{
    System.Console.Write(e.Data);
}

C# : Créer rapidement un événement

Fiche mémo pour créer rapidement un événement lancé d’une classe, et abonnement à cet event.
Etapes de création d’un événement customisé complet (C#):

  • 1- DANS LA CLASSE SOULEVANT L’EVENEMENT
  • Delegate :
    public delegate void MonHandler(object sender, MonEventArgs e);
  • L’événement lui-même:
    public event MonHandler On_QuelqueChoseSePassed;
  • Classe « MonEventArgs » :
    public class MonEventArgs : EventArgs
        {
            private int _iInformation1;
            private string _sInformation2;
            internal MFluxEventArgs(int iInfo1, string sInfo2)
            {
                _iInformation1 = iInfo1;
                _sInformation2 = sInfo2;
            }
            public int Information1
            {
                get { return _iInformation1; }
            }
            public string Information2
            {
                get { return _sInformation2; }
            }
        }
  • Fonction qui lance l’événement :
        private void FireQuelqueChoseSePassed(MonEventArgs e)
        {
            if (On_QuelqueChoseSePassed != ')
            {
                On_QuelqueChoseSePassed(this, e);
            }
        }

 

  • Maintenant, dans mon code, je vais avertir quand quelque chose se passe :

    ...
    FireQuelqueChoseSePassed(new MFluxEventArgs(15, "On est ici"));
    ...
  • 2- AILLEURS, on souhaite s’abonner à l’événement :
  • On abonne une fonction de la même signature que le delegate :

    MaClasse.On_QuelqueChoseSePassed +=new MaClasse.MonHandler(LaFonctionQuiVaRecevoirLEvent);
  • La fonction abonnée :

    protected void LaFonctionQuiVaRecevoirLEvent(object sender, MonEventArgs e)
    {
    // Ici, on peut utiliser "sender" (objet MaClasse instancié), ou "e" (qui contient un entier et un string...)
    }

.NET : Le bon encodage

Bien définir la balise « Globalization » du web.config.
Diantre, votre page web s’affiche, mais les caractères spéciaux sont de vraies hiéroglyphes. En .NET, la solution se cache souvent dans un web.config mal… configuré :
<globalization requestEncoding="ISO-8859-15" responseEncoding="ISO-8859-15" fileEncoding="ISO-8859-15" culture="fr-FR" uiCulture="fr-FR" />

MOSS 2007 : Comment modifier une liste SharePoint via un WebService sous SSIS ?

Tutoriel.

SOMMAIRE

  • 1. INTRODUCTION

     

     
     

  • 2. VERIFIER L’EXISTENCE DU WEB SERVICE
  • 3. CREER LA DLL DE PROXY

     

     
     

  • 4. EXEMPLE DE PROJET SOUS SSIS

  • 1. INTRODUCTION

     

    1.1. Description

     
    Voici une manière rapide de mettre à jour des métadonnées d’éléments d’une liste SharePoint grâce aux web services natifs de l’application. Ces web services seront appelés à partir de Microsoft SQL Server 2005 Integration Services (SSIS).

    1.2. Pré-requis

     
    Les logiciels suivants doivent être installés sur la machine :
     

      • WSS 3.0 et MOSS 2007

     

      • Visual Studio 2005

     

      • SQL Server 2005

     

    2. VERIFIER L’EXISTENCE DU WEB SERVICE

     
    Sous IE, taper l’URL suivante : http://serveur:port/_vti_bin/lists.asmx
     
     » serveur:port  » étant un site SharePoint dans lequel vous souhaitez attaquer les listes.
     
    L’écran suivant devrait s’afficher avec la liste complète des opérations que propose le Web Service :

    3. CREER LA DLL DE PROXY

     
    Une DLL de proxy fournit toutes les classes qui permettent de communiquer avec le Web Service. Il serait possible de développer soi-même ces classes, mais ce serait inutile, car la création de cette DLL est très simple. Elle nous permet de faire abstraction, entre autres, de l’utilisation du protocole SOAP et du formatage des requêtes à envoyer au serveur.
     
    Une DLL de proxy = Un Web Service.
     
    NB : SSIS est capable de communiquer directement avec des Web Services grâce à la  » Web Service Task « . Cependant, le Web Service List.asmx contient des paramètres de type complex qui ne sont pas gérés par SSIS. D’où la création de cette DLL qui sera fournie à SSIS.

    3.1. Création de la DLL

     
    Ouvrir Visual Studio 2005, même une version Express gratuite suffit. Ici nous utiliserons Visual C# 2005 Express Edition.
     
    Ajout d’une référence vers le Web Service :
     

      • Faire Fichier > Nouveau Projet > Class Library

     

      • Donner un nom du genre  » MOSSWebService  » et cliquer sur OK.

     

      • Dans l’explorateur de solution, faites un clic-droit sur  » Références  » et cliquer sur  » Ajouter une référence Web  » :

      • Dans la fenêtre qui apparait, renseigner l’URL du Web Service (la page comme vue précédemment devrait s’afficher en aperçu), et donner un nom à la référence (ici, MOSSWebService_Lists) :

      • Cliquer sur  » Ajouter la référence « .

     

      • NB : A partir de ce moment là, Visual Studio va générer automatiquement tout le code adapté au Web Service en utilisant WSDL.exe (qu’on aurait pu aussi utiliser  » à la main  » directement en ligne de commande).

     

      • Sauvegarder la solution dans un répertoire quelconque.

     
     
    Avant de compiler notre solution, il va falloir signer l’assembly :
     

      • Faire un clic-droit sur le projet (MOSSWebService), et faites  » Propriétés « .

     

      • Cliquer sur l’onglet  » Signature « .

     

      • Cliquer sur  » Signer l’assembly « 

     

      • Dans la liste déroulante en dessous, faire  » <nouveau�> « 

     

      • Une fenêtre surgit, donner un nom au fichier de clé (ici, MOSSWebService_Lists)

     

      • Décocher la case  » Protéger mon fichier par un mot de passe « 

     

      • Faire OK, vous devriez obtenir cet écran :

      • Faites CTRL + S avant de cliquer-droit sur la solution et cliquer sur  » Générer la solution « .

     
     
    La DLL est créée !

    3.2. Enregistrement dans le GAC

  • Copier la DLL, présente dans  » Repertoire_de_la_solution / MOSSWebService / bin / Release / « , vers le répertoire  » C: WINDOWS Microsoft.NET Framework v2.0.xxxxx « .
  • Ouvrir une fenêtre de commandes MSDOS.
  • Aller dans le répertoire  » C:WINDOWSMicrosoft.NETFrameworkv2.0.xxxxx « .
  • Taper  » gacutil –i MOSSWebService.dll  » et faites ENTREE.
  • L’assembly et ajoutée dans le cache et est disponible pour SSIS.
  •  
    NB : Certains diront qu’il suffit de faire un glisser-déposer de la DLL pour la placer dans le GAC. A cela je réponds : « C’est en faisant n’importe quoi qu’on devient n’importe qui » (L.Briand).

    4. EXEMPLE DE PROJET SOUS SSIS

  • Lancer SQL Server Business Intelligence Development Studio, et faire  » Fichier > Nouveau > Projet  » puis sélectionner  » Project Integration Service  » et faire OK.
  • Faire un  » Glisser – déposer  » d’une tâche de script de la boite à outils vers la page Flux de contrôle :
  • Double-cliquer sur la tache de script.
  • Une fenêtre d’édition de la tâche s’ouvre. Cliquer sur  » Script  » à gauche, puis sur le bouton  » Créer un script  » en bas :
  • Une nouvelle fenêtre Visual Studio s’ouvre, avec du code source prédéfini.
  • Dans l’  » explorateur de projet  » (ici à gauche), faire un clic-droit sur  » Références  » et cliquer sur  » Ajouter une référence  » :
  • Choisir la nouvelle DLL fraichement créée (MOSSWebService.dll), faire  » Ajouter  » puis  » OK « .
  • Faire de même pour les deux DLL suivantes :
      • System.XML.dll

     

      • System.Web.Services.dll

     
     

  • Modifier le code comme suit :
      • Ajouter deux lignes d’import :Imports MOSSWebService
        Imports MOSSWebService.MOSSWebService_Lists

     

      • Dans le corps de la fonction Main(), ajouter le code suivant :

     
     

  • Public Sub Main()
            Try
                ’’’ URL du Web Service
                Dim sUrl As String = "http://URL/_vti_bin/lists.asmx"
                ’’’ Objet représentant le Web Service
                Dim oListWS As New Lists
                oListWS.Credentials = System.Net.CredentialCache.DefaultCredentials
                oListWS.Url = sUrl
                ’’’ Génération de la requête CAML de mise à jour de la liste
                Dim xDoc As New System.Xml.XmlDocument
                Dim xBatch As System.Xml.XmlElement = xDoc.CreateElement("Batch")
                xBatch.SetAttribute("OnError", "Return")
                ’’’ Corps de la requête CAML : Cette requête va simplement changer la metadonnée "Title"
                ’’’ de l’item d’identifiant 20.
                Dim sBatch As String = ""
                sBatch += "20"
                sBatch += "Nouveau Titre"
                sBatch += ""
                xBatch.InnerXml = sBatch
                ’’’ Lancement de la fonction de MAJ de la liste "Bibliothèque des sinistres".
                Dim xReturn As System.Xml.XmlNode = oListWS.UpdateListItems("Bibliothèque des sinistres", xBatch)
                ’’’ Affichage de la réponse renvoyée par le serveur.
                Dts.Events.FireInformation(1, "", xReturn.InnerXml, "", 0, False)
                ’’’ La tâche s’est bien passée
                Dts.TaskResult = Dts.Results.Success
            Catch Ex As Exception
                ’’’ La tâche a échoué
                Dts.TaskResult = Dts.Results.Failure
            End Try
    	End Sub
    
  • Faire CTRL + S, et fermer la fenêtre Visual Studio.
  • De retour sur le SSIS, faire F5 pour lancer le package.
  • L’item d’identifiant 20 (s’il existe) aura son titre à  » Nouveau Titre  » (à vérifier sous le site SharePoint).