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);
}
Catégorie : .NET
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...)
}
C# : long, int, Int32 et Int64… Quels rapports ?
Comme le dit si bien un internaute anglophone dont l’expertise C-Sharpienne est aussi pointue que son phrasé shakespearien :
In C#, « int » is an alias for Int32, and « long » is an alias for « Int64 ».
Rien à ajouter, donc…
.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 « .
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 :
- Ajouter deux lignes d’import :
-
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).