Procédure : Créer un gestionnaire d’événements Project Server et consigner un événement (traduction automatique)

Dernière modification : vendredi 29 avril 2011

S’applique à : Office 2010 | Project 2010 | Project Server 2010 | SharePoint Server 2010

Dans cet article
Développement d'un gestionnaire d'événements
Déploiement du Gestionnaire d'événements
Inscription de l'Association de gestionnaire d'événements
Le Gestionnaire d'événements de test: à l'aide de l'Observateur d'événements et le journaux ULS
Le Gestionnaire d'événements de débogage

Important

Cet article a été traduit automatiquement, voir l’avertissement. Vous pouvez consulter la version en anglais de cet article ici.

Le service des événements offre un moyen d’étendre Microsoft Project Server 2010 en ajoutant une nouvelle logique métier. Project Server génère des pré-événements et des post-événements lorsque des méthodes PSI modifient des objets métiers tels que Project, Task, Resource ou Timesheet. Lorsque vous associez un gestionnaire d’événements à un événement, Project Server exécute le gestionnaire d’événements lorsque cet événement particulier se produit. Cet article montre comment créer, déployer, tester et déboguer un gestionnaire d’événements, et comment écrire une entrée dans le journal des événements Windows et dans le journal de suivi du service de journalisation unifiée (ULS, Unified Logging Service) pour les applications SharePoint.

Important

Vous pouvez développer un gestionnaire d'événements Project Server sur l'ordinateur local qui exécute Project Server ou sur un ordinateur distant. Dans les deux cas, vous devez utiliser uniquement un test de l'installation de Project Server, pas un serveur de production, à développer, tester et déboguer des gestionnaires d'événements.

Le présent article contient les sections suivantes :

  • Développement d'un gestionnaire d'événements

  • Déploiement du Gestionnaire d'événements

  • Inscription de l'Association de gestionnaire d'événements

  • Le Gestionnaire d'événements de test: à l'aide de l'Observateur d'événements et le journaux ULS

  • Le Gestionnaire d'événements de débogage

Notes

Microsoft Project Professionnel 2010 et Project Web App appellent parfois des méthodes PSI privées dans les services de PWA et WinProj, ils ne déclenchent pas toujours les mêmes événements que les méthodes publiques de la PSI. Lorsque vous développez des gestionnaires d'événements, testez les actions dans Project Professionnel 2010, Project Web App, pages Détails (PDP) pour les workflows et dans des applications tierces qui utilisent la PSI, de déclencher des gestionnaires d'événements comme prévu du projet.

Par exemple, la création d'un projet à l'aide de Project Professionnel 2010 ne déclenche pas le Gestionnaire d'événements OnCreating. Toutefois, la création d'un projet dans Project Web App en sélectionnant le workflow de Proposition de l'échantillon ou le Plan de projet base dans le menu déroulant de Nouveau sur la page Centre de projets déclenche le Gestionnaire d'événements OnCreating.

Bien que Project Server 2010 comprend plus d'événements que Microsoft Office Project Server 2007, gestionnaires d'événements fonctionnent de la même manière. Pour plus d'informations, consultez Project Server Events. Pour obtenir un exemple qui inclut des gestionnaires d'événements pour l'utilisateur délégation OnActivated et OnDeactivated post-événements, reportez-vous à la section de Christophe Fiessinger billet de blog, Gestionnaire d'événements d'Audit Project Server 2010 délégation (éventuellement en anglais). Pour un gestionnaire d'événements exemple le pré-événement OnSending modifications notifications par e-mail, consultez How to: Customize E-Mail for Project Server Notifications.

Développement d'un gestionnaire d'événements

Le Gestionnaire d'événements OnCreating dans cet article concerne la pré-événement ProjectCreating, qui se produit juste avant que la méthode QueueCreateProject crée un projet. Dans un pré-événement, vous pouvez ajouter des règles d'entreprise et annuler l'action si les règles ne sont pas remplies. L'exemple TestProjectCreating montre comment utiliser un DataSet dans le cas des arguments et comment utiliser PSI un autre service de l'événement gestionnaire. L'exemple vérifie si le projet pour un service spécifié possède plus de trois tâches. Dans ce cas, l'événement est annulé. Dans les deux cas, le Gestionnaire d'événements écrit dans les deux le journal des événements et le journal ULS.

Pour une liste de tous les événements de Project Server 2010, consultez l'énumération PSEventID. Pour obtenir une liste des gestionnaires d'événements qui sont disponibles pour l'objet Project, consultez les méthodes dans la classe ProjectEventReceiver. Pré-événements peuvent être annulés dans un gestionnaire d'événements. Les post-événements, tels que l'événement ProjectCreated, ne peut pas être annulées ; les post-événements sont utilisés pour recueillir et échanger des informations résultant des actions qui ont déjà eu lieu. Chaque événement fournit des arguments d'événement dans l'événement paramètres du gestionnaire. Les paramètres pour le Gestionnaire d'événements OnCreating incluent des informations de contexte, telles que le nom d'utilisateur, le GUID du site Project Web App et la culture préféré. Les arguments d'événement dans le paramètre ProjectPreEventArgs incluent la ProjectDataSet du projet doit être créé, le GUID du projet et le nom du projet.

Remarque sur la sécuritéRemarque sur la sécurité

Gestionnaires d'événements de Project Server exécutent sur un ordinateur de Project Server avec les informations d'identification d'administrateur de batterie de serveurs SharePoint, ou avec le compte d'ouverture de session pour le service de 2010 de Service événements Microsoft Project Server . Dans la mesure où les gestionnaires d'événements est déjà exécutent sur le serveur Project Server back-end, pas le Project Web App front-end, vous n'utilisez pas normalement l'emprunt d'identité dans un gestionnaire d'événements.

Procédure 1. Pour développer un gestionnaire d'événements

  1. Si vous développez sur un ordinateur qui exécute Project Server, vous pouvez définir directement les références aux assemblys suivants à l'aide de la boîte de dialogue Ajouter une référence pour rechercher l'assembly. Si vous développez sur un ordinateur distant, copiez les assemblys suivants à partir de l'ordinateur Project Server à un répertoire approprié sur l'ordinateur de développement :

    • Microsoft.Office.Project.Schema.dll :  L'espace de noms Microsoft.Office.Project.Server.Schema inclut les définitions de classe nécessaires, tels que ProjectDataSet, pour les arguments d'événement. Copier à partir de, ou naviguez vers le répertoire [Windows]\assembly\GAC_MSIL\Microsoft.Office.Project.Schema\14.0.0.0__71e9bce111e9429c.

      Si les arguments d'événement n'incluent pas un des jeux de données PSI, l'espace de noms Microsoft.Office.Project.Server.Schema n'est pas nécessaire.

    • Microsoft.Office.Project.Server.Events.Receivers.dll :  Copier à partir de, ou naviguez vers le répertoire [Program Files]\Microsoft Office Servers\14.0\Bin sur l'ordinateur de Project Server.

    • Microsoft.Office.Project.Server.Library.dll :  Copier à partir de, ou naviguez vers le répertoire [Program Files]\Microsoft Office Servers\14.0\Bin.

    • Microsoft.SharePoint.dll :  L'espace de noms Microsoft.SharePoint est nécessaire si le Gestionnaire d'événements utilise un autre service PSI ou s'il utilise des sites de projet. Copier à partir de, ou naviguez vers le répertoire [Program Files]\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI.

    Pour copier les assemblys, sur l'ordinateur de Project Server, exécutez une fenêtre d'invite de commandes Visual Studio (2010) en tant qu'administrateur. Le fichier CopyRefs.bat (dans le téléchargement du Kit de développement Project 2010) copie les assemblys nécessaires à partir de l'ordinateur Project Server à un ordinateur de développement. Modifier la nom de l'ordinateur de développement et le nom de partage dans le script suivant.

    echo off
    
    set SHARE=\\DEV_PC\ShareName
    
    set SCHEMA=C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Project.Schema\14.0.0.0__71e9bce111e9429c
    set PROJ_SERVER_LIBS="c:\Program Files\Microsoft Office Servers\14.0\Bin"
    set SHAREPOINT_LIBS="C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI"
    
    xcopy /y %SCHEMA%\*.dll %SHARE%
    xcopy /y %PROJ_SERVER_LIBS%\Microsoft.Office.Project.Server.Events.Receivers.dll %SHARE%
    xcopy /y %PROJ_SERVER_LIBS%\Microsoft.Office.Project.Server.Library.dll %SHARE%
    xcopy /y %SHAREPOINT_LIBS%\Microsoft.SharePoint.dll %SHARE%
    
  2. Dans Microsoft Visual Studio 2010, créez un projet de type Bibliothèque de classes; par exemple, nommez le projet TestCreatingProject. Pour un projet Visual c#, vous pouvez renommer le Class1.cs, par exemple, vous pouvez renommer qu'il s'agit de TestCreatingProject.cs. Si vous modifiez le nom d'espace de noms dans le code source, assurez-vous que vous modifiez également l'espace de noms par défaut dans l'onglet Application du volet de Propriétés projet.

  3. Ajoutez les références qui sont spécifiés dans l'étape 1, puis ajoutez les assemblys de référence suivants :

    • System.Runtime.Serialization.dll

    • System.Security.dll

    • System.ServiceModel.dll

  4. Les références globales dans le fichier TestCreatingProject.cs, ajoutez les lignes suivantes :

    using System.Diagnostics;
    using System.ServiceModel;
    using System.Security.Principal;
    using Microsoft.SharePoint;
    using Microsoft.Office.Project.Server.Events;
    using PSLib = Microsoft.Office.Project.Server.Library;
    using PSSchema = Microsoft.Office.Project.Server.Schema;
    
  5. Supprimer la définition de Class1 dans le fichier TestCreatingProject.cs et créez une classe de gestionnaire d'événements qui dérive de la classe de récepteur d'événement de base abstraite dont vous avez besoin. Par exemple, nommez la classe CheckProjectDepartment. Dans l'exemple suivant, l'espace de noms par défaut est modifiée, et la classe dérive de la classe abstraite de base ProjectEventReceiver.

    namespace Microsoft.SDK.Project.Samples.TestCreatingProject
    {
        public class CheckProjectDepartment : ProjectEventReceiver
        {
        }
    }
    
  6. Créez une méthode pour substituer la méthode de base pour l'événement spécifique. Chaque événement comporte une méthode de base correspondante, vous devez remplacer par votre propre implémentation. Par exemple, pour écrire un gestionnaire d'événements pour l'événement Creating de l'objet métier de Project, vous substituez la méthode OnCreating. Dans Visual Studio, IntelliSense vous permet de sélectionner les méthodes de base disponibles et termine le cadre de la méthode comme suit :

    public override void OnCreating(PSLib.PSContextInfo contextInfo, ProjectPreEventArgs e)
    {
        base.OnCreating(contextInfo, e);
    }
    

    Vous pouvez commenter les ou supprimer la méthode base.OnCreating, car la méthode de base aucun traitement n'est dans une classe abstraite.

  7. La solution TestCreatingProject écrit dans le journal des événements et le journal ULS. Pour créer un service de journalisation pour le journal de suivi ULS, ajoutez une classe nommée LoggingService au projet Visual Studio et ensuite modifier l'espace de noms correspond à celle de la classe CheckProjectDepartment. Le code suivant est l'implémentation de classe complète dans le fichier LoggingService.cs, qui crée une catégorie d'informations avec un niveau de Verbose et un avertissement avec un niveau de Unexpected. Pour plus d'informations sur l'utilisation de la norme ULS journal de suivi, voir Écriture dans le journal de suivi à partir de code personnalisé et Fonctionnalités de débogage et de journalisation dans SharePoint 2010.

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SharePoint.Administration;
    
    namespace Microsoft.SDK.Project.Samples.TestCreatingProject
    {
        // Define a custom logging service for the ULS log.
        public class LoggingService : SPDiagnosticsServiceBase
        {
            private const string LOG_SERVICE_NAME = "Project Test Logging Service";
            private const string PRODUCT_DIAGNOSTIC_NAME = "Project Server Event Handler";
            private const uint EVENT_ID = 5050;
    
            // ULS categories:
            public const string PROJECT_INFO = "Event Handler Information";
            public const string PROJECT_WARNING = "Event Handler Warning";
    
            private static LoggingService activeLoggingService;
    
            private LoggingService() : base(LOG_SERVICE_NAME, SPFarm.Local)
            {
            }
    
            // Register the product name and set the ULS log categories that are available.
            protected override IEnumerable<SPDiagnosticsArea> ProvideAreas()
            {
                List<SPDiagnosticsArea> areas = new List<SPDiagnosticsArea>
                {
                    new SPDiagnosticsArea(
                        PRODUCT_DIAGNOSTIC_NAME,
                        new List<SPDiagnosticsCategory>
                        {
                            new SPDiagnosticsCategory(PROJECT_INFO,
                                                      TraceSeverity.Verbose, 
                                                      EventSeverity.Information),
                            new SPDiagnosticsCategory(PROJECT_WARNING,
                                                      TraceSeverity.Unexpected,
                                                      EventSeverity.Warning),
                        })
                };
                return areas;
            }
    
            // Create a LoggingService instance.
            public static LoggingService Active
            {
                get
                {
                    if (activeLoggingService == null)
                        activeLoggingService = new LoggingService();
                    return activeLoggingService;
                }
            }
    
            // Write an information message to the ULS log.
            public static void LogMessage(string categoryName, string message)
            {
                SPDiagnosticsCategory category =
                    LoggingService.Active.Areas[PRODUCT_DIAGNOSTIC_NAME].Categories[categoryName];
                LoggingService.Active.WriteTrace(EVENT_ID, category, TraceSeverity.Verbose, message);
            }
    
            // Write an error message to the ULS log.
            public static void LogError(string categoryName, string message)
            {
                SPDiagnosticsCategory category =
                    LoggingService.Active.Areas[PRODUCT_DIAGNOSTIC_NAME].Categories[categoryName];
                LoggingService.Active.WriteTrace(EVENT_ID, category, TraceSeverity.Unexpected, message);
            }
        }
    }
    
  8. Ajoutez le fichier wcfLookupTable.cs du proxy du service LookupTable pour le projet Visual Studio. Les fichiers de proxy PSI sont dans le sous-répertoire Documentation\Intellisense\WCF\Source de la Project 2010 de téléchargement du Kit de développement.

  9. Écrivez l'implémentation de gestionnaire d'événements OnCreating, en utilisant les propriétés des arguments d'événement PSContextInfo et ProjectPreEventArgs. Dans le code suivant, l'objet eventLog nécessite l'instruction suivante pour obtenir une référence à la EventLog du système : using System.Diagnostics;.

    Notes

    Sortie de l'objet ProjectDataSet dans l'exemple est à des fins de débogage uniquement ; Il ne doit y avoir aucun fichier de sortie sur un serveur de production.

    Le Gestionnaire d'événements OnCreating effectue les opérations suivantes :

    1. Crée une instance de EventLog et affecte sa source.L'entrée de journal d'événements utilise un numéro d'identification des événements spécifiques à l'application facultatif (la constante EVENT_ID) qui vous permet de filtrer les événements.

    2. Obtient des informations à partir d'arguments d'événement, comme le nom d'utilisateur, les GUID Project Web App et ProjectDataSet une autre application utilisée pour appeler QueueCreateProject. Le ProjectDataSet dans les arguments d'événement est en lecture seule ; Il peut être affecté à une variable de type Microsoft.Office.Project.Server.Schema.ProjectDataSet.

    3. Obtient le GUID de la valeur dans la table de choix Department intégrés. Le GUID est la propriété CODE_VALUE du champ personnalisé Project Departments. Le GUID du champ personnalisé Project Departments lui-même est la valeur PROJECT_DEPARTMENT_MD_PROP_UID.

    4. Recherche le nom du service en utilisant la méthode GetDepartmentValue (voir étape 10 et étape 11).

    5. Définit la propriété Cancel la false de valeur par défaut pour permettre à l'action de l'événement de continuer.

    6. Implémente la logique métier et détermine si la propriété Cancel doit être définie sur true. Dans le Gestionnaire d'événements OnCreating exemple, s'il existe plus de trois tâches du projet pour un service spécifié, l'action de l'événement est annulé et le projet n'est pas créé.

    7. Écrit le journal des événements et ULS les entrées du journal en utilisant la méthode WriteLogEntries (voir l'étape 12).

    public class CheckProjectDepartment : ProjectEventReceiver
    {
        // Change the department name to match a department in your installation.
        private const string PROJECT_DEPARTMENT2CHECK = "Test Dept 2";
    
        private const string EVENT_SOURCE = "Project Event Handler";
        private const int EVENT_ID = 5050;
        private static SvcLookupTable.LookupTableClient lookupTableClient;
        private EventLog eventLog;
    
        // Change the output directory for your computer.
        private const string OUTPUT_FILES = @"C:\Project\Samples\Output\";
        private static string outFilePath;
    
        public override void OnCreating(PSLib.PSContextInfo contextInfo, ProjectPreEventArgs e)
        {
            // The base method does no processing in an abstract class.
            //base.OnCreating(contextInfo, e);
    
            // Create an EventLog instance and assign its source.
            eventLog = new EventLog();
            eventLog.Source = EVENT_SOURCE;
            string logEntry = string.Empty;
    
            // Get information from the event arguments.
            string userName = contextInfo.UserName;
            Guid pwaUid = contextInfo.SiteGuid;
    
            string projectName = e.ProjectName;
            Guid projectUid = e.ProjectGuid;
            PSSchema.ProjectDataSet projDs = e.ProjectDataSet;
    
            // Write the ProjectDataSet to a file, for debugging purposes.
            outFilePath = OUTPUT_FILES + "ProjectDataSet4CreatingEventHandler.xml";
            projDs.WriteXml(outFilePath);
    
            e.Cancel = false;
    
            // Get the GUID of the default Project Departments custom field.
            Guid projDeptCFMdPropUid = PSLib.CustomField.PROJECT_DEPARTMENT_MD_PROP_UID;
            Guid projDeptUid = Guid.Empty;
    
            for (int i = 0; i < projDs.ProjectCustomFields.Rows.Count; i++)
            {
                if (projDs.ProjectCustomFields[i].MD_PROP_UID == projDeptCFMdPropUid)
                {
                    // Get the custom field value, which is the GUID of the value in 
                    // the Department lookup table.
                    projDeptUid = projDs.ProjectCustomFields[i].CODE_VALUE;
                    break;
                }
            }
    
            int numTasks = projDs.Task.Rows.Count;
            string departmentName = GetDepartmentValue(pwaUid, projDeptUid);
    
            if (projDeptUid != Guid.Empty)
            {
                // Sample 'business rules.'
                if (departmentName == PROJECT_DEPARTMENT2CHECK && numTasks > 3)
                {
                    e.Cancel = true;
                }
            }
            // For this example, write the log entries in all cases.
            WriteLogEntries(e.Cancel, numTasks, departmentName, userName, projectName);
        }
    
        // Add the GetDepartmentValue method and the WriteLogEntries method.
    }
    
  10. Ecrivez la méthode GetDepartmentValue. Dans la mesure où le GUID et la valeur de texte du département de projet sont contenues dans la table LookupTableTrees de la table de choix Department et le GUID de la table de choix intégrées Department est spécifié par DEPARTMENTS_LT_UID, vous pouvez utiliser la méthode ReadLookupTablesByUids pour obtenir les données de table de recherche. À l'aide d'une méthode de table de recherche nécessite l'initialisation d'un objet LookupTableClient, qui nécessite ensuite la méthode SetClientEndpoint (étape 11).

    La méthode GetDepartmentValue effectue une itération dans la table LookupTableTrees pour trouver le noeud feuille où le LT_STRUCT_UID (le GUID de la valeur de table de choix) correspond au GUID qui a été obtenu à partir de la ProjectDataSet du département. S'il existe une correspondance, le nom du service est la propriété de LT_VALUE_TEXT.

    // Get the name of the department.
    private string GetDepartmentValue(Guid pwaUid, Guid departmentUid)
    {
        // Set the language code for the lookup table; U.S. English in this case.
        const int LCID = 1033;  
        string result = string.Empty;
    
        SetClientEndpoint(pwaUid);
    
        // Read the Departments lookup table data.
        Guid[] lutUids = { PSLib.LookupTables.DEPARTMENTS_LT_UID };
        SvcLookupTable.LookupTableDataSet lutDs = 
            lookupTableClient.ReadLookupTablesByUids(lutUids, false, LCID);
    
        // Find the text value in the lookup table tree item that matches the department GUID.
        for (int i = 0; i < lutDs.LookupTableTrees.Count; i++)
        {
            if (lutDs.LookupTableTrees[i].LT_STRUCT_UID == departmentUid)
            {
                result = lutDs.LookupTableTrees[i].LT_VALUE_TEXT;
                break;
            }
        }
        lookupTableClient.Close();
        return result;
    }
    
  11. Dans la mesure où vous ne pouvez pas utiliser un fichier app.config pour un gestionnaire d'événements, d'écrire la méthode SetClientEndpoint pour définir par programmation le point de terminaison WCF pour l'objet LookupTableClient. Code de la méthode SetClientEndpoint est très similaire au code dans la section Configuration des Services par programme de l'article Procédure pas à pas : Développement d’applications PSI à l’aide de WCF (traduction automatique). La principale différence est que le GUID Project Web App est connu dans les arguments d'événement. Lorsque vous initialisez un objet SPSite avec le GUID du site, vous pouvez obtenir l'URL du site.

    // Programmatically set the WCF endpoint for the LookupTable client.
    private void SetClientEndpoint(Guid pwaUid)
    {
        const int MAXSIZE = 500000000;
        const string svcRouter = "/_vti_bin/PSI/ProjectServer.svc";
    
        BasicHttpBinding binding = null;
    
        SPSite pwaSite = new SPSite(pwaUid);
        string pwaUrl = pwaSite.Url;            
    
        if (pwaSite.Protocol.ToLower() == "https:")
        {
            // Create a binding for HTTPS.
            binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
        }
        else
        {
            // Create a binding for HTTP.
            binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
        }
    
        binding.Name = "basicHttpConf";
        binding.SendTimeout = TimeSpan.MaxValue;
        binding.MaxReceivedMessageSize = MAXSIZE;
        binding.ReaderQuotas.MaxNameTableCharCount = MAXSIZE;
        binding.MessageEncoding = WSMessageEncoding.Text;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
    
        // The endpoint address is the ProjectServer.svc router for all public PSI calls.
        EndpointAddress address = new EndpointAddress(pwaUrl + svcRouter);
    
        lookupTableClient = new SvcLookupTable.LookupTableClient(binding, address);
        lookupTableClient.ChannelFactory.Credentials.Windows.AllowedImpersonationLevel
            = TokenImpersonationLevel.Impersonation;
        lookupTableClient.ChannelFactory.Credentials.Windows.AllowNtlm = true;
    }
    
  12. Créez la méthode WriteLogEntries. Le code suivant crée un type d'information et un type d'avertissement pour l'entrée de journal des événements, construit la chaîne logEntry qui contient des informations sur l'événement et écrit l'entrée de journal des événements. L'entrée de journal des événements peut être de plusieurs lignes de texte.

    Le code crée ensuite un message de journal ULS, où les informations doivent être dans une seule ligne de texte. Si l'événement est annulé, la méthode LoggingService.LogError écrit le message d'avertissement dans le journal ULS ; Sinon, le LoggingService.LogMessage écrit le message d'information.

    // Write entries to the event log and to the ULS log.
    private void WriteLogEntries(bool canceled, int numTasks, string projectDept,
        string userName, string projectName)
    {
        EventLogEntryType entryType = EventLogEntryType.Information;
        string taskInfo = "\nThe number of tasks is valid.";
    
        // Create an event log entry.
        if (canceled)
        {
            entryType = EventLogEntryType.Warning;
            taskInfo = 
                "\nFor that department, the project cannot be created with more than 3 tasks.";
        }
    
        string logEntry = "User: " + userName;
        logEntry += "\nProject: " + projectName;
    
        projectDept = ((projectDept == string.Empty) ? "[none]" : projectDept);
        logEntry += "\nDepartment: " + projectDept;
        logEntry += "\nTasks: " + numTasks.ToString() + taskInfo;
    
        // Create an event log entry.
        eventLog. WriteEntry(logEntry, entryType, EVENT_ID);
    
        // Create a ULS log entry.
        logEntry = string.Format(
            "User: {0}; project: {1}; department: {2}; tasks: {3}. ",
            userName, projectName, projectDept, numTasks);
        logEntry += taskInfo;
    
        if (canceled)
        {
            LoggingService.LogError(LoggingService.PROJECT_WARNING, logEntry);
        }
        else
        {
            LoggingService.LogMessage(LoggingService.PROJECT_INFO, logEntry);
        }
    }
    
  13. Enfin, créez un fichier de clé de nom fort pour l'assembly TestCreatingProject.dll. Par exemple, vous pouvez ouvrir la fenêtre de propriétés de TestCreatingProject dans Visual Studio, cliquez sur l'onglet Signature et puis sélectionnez la case à cocher Signer l’assembly . Créer un fichier de clé de nom fort, tel que CreatingProjectKey.snk.

Une fois la solution TestCreatingProject compile sans erreur, vous pouvez déployer la solution à l'ordinateur Project Web App.

Déploiement du Gestionnaire d'événements

Il existe deux manières de déployer l'assembly du Gestionnaire d'événements. 2 A de procédure montre comment inscrire l'assembly dans le global assembly cache de l'ordinateur Project Web App. Vous devez disposer de l'accès d'ouverture de session administrateur sur l'ordinateur de Project Server. Lorsque vous enregistrez l'assembly dans le global assembly cache, vous pouvez obtenir le jeton de clé publique est nécessaire pour tester le Gestionnaire d'événements et d'enregistrement ultérieurement le Gestionnaire d'événements sur un serveur de production.

2 B de procédure montre comment inscrire l'assembly dans le répertoire [Program Files]\Microsoft Office Servers\14.0\Bin\ProjectServerEventHandlers. Il n'est pas nécessaire pour vous permettre d'accéder directement au global assembly cache sur un ordinateur de Project Server de production.

2 A de procédure. Pour enregistrer un gestionnaire d'événements dans le global assembly cache

  1. Exécution d'une fenêtre d'invite de commandes Visual Studio en tant qu'administrateur, placez-vous dans le répertoire de solution et puis tapez la commande suivante :

    gacutil /i bin\debug\TestCreatingProject.dll
    
  2. Vérifiez que votre assembly est inscrit. Ouvrez le répertoire [Windows]\assembly dans l'Explorateur Windows (ou type assembly dans la boîte de dialogue Exécuter du menu Démarrer ), puis faites défiler vers le bas pour voir que l'assembly TestCreatingProject est inscrit dans la Figure 1.

    La figure 1. L'assembly TestCreatingProject est enregistré dans le global assembly cache

    TestCreatingProject dans le Global Assembly Cache (GAC)

  3. Copiez le nom complet de l'assembly enregistré dans un fichier texte à utiliser lorsque vous enregistrez le Gestionnaire d'événements dans Project Server. Le nom complet contient le nom de texte, de culture, version et jeton de clé publique :

    1. Droit de l'assembly TestCreatingProject dans le global assembly cache et puis cliquez sur Propriétés.

    2. Dans la boîte de dialogue Propriétés de TestCreatingProject , sélectionnez le nom, le copier et puis collez le nom dans un fichier texte comme dans le bloc-notes.

    3. Copiez la culture, la version et le jeton de clé publique, puis coller chaque dans le fichier texte. Voici le nom complet de l'assembly :

      TestCreatingProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=92978aaaab03ff98
      
  4. Copiez le nom de classe complet dans le fichier texte à utiliser pour l'enregistrement du Gestionnaire d'événements avec Project Web App. Le nom de classe complet de l'exemple de TestCreatingProject est Microsoft.SDK.Project.Samples.TestCreatingProject.CheckProjectDepartment.

2 B de procédure. Pour enregistrer un gestionnaire d'événements à l'aide de déploiement de XCopy

  1. L'administrateur système doit créer un partage qui vous donne un accès complet au répertoire [Program Files]\Microsoft Office Servers\14.0\bin\ProjectServerEventHandlers sur l'ordinateur de Project Server. Par exemple, créez un partage nommé EventHandlers pour le répertoire.

    Project Server enregistre automatiquement les assemblys de gestionnaire d'événements qui se trouvent dans le sous-répertoire ProjectServerEventHandlers.

  2. Dans une fenêtre d'invite de commandes Visual Studio sur l'ordinateur de développement, accédez au répertoire qui contient l'assembly du Gestionnaire d'événements et tapez la commande suivante (utilisez des guillemets autour du répertoire de destination, si le chemin d'accès contient des espaces) :

    xcopy /y TestCreatingProject.dll \\ServerName\EventHandlers
    

    L'assembly du Gestionnaire d'événements est maintenant copié sur l'ordinateur de Project Server dans le répertoire [Program Files]\Microsoft Office Servers\14.0\bin\ProjectServerEventHandlers.

Pendant le test, vous devrez probablement désenregistrer puis réenregistrer l'assembly à plusieurs reprises. La solution de TestCreatingProject contient le script suivant dans le fichier InstallEventHandler.bat, dans le sous-répertoire Utilities. Exécutez le fichier batch en tant qu'administrateur.

echo off

@SET EVENT_HANDLERS="C:\Program Files\Microsoft Office Servers\14.0\Bin\ProjectServerEventHandlers"

REM To deploy to a production server, copy the event handler to the ProjectServerEventHandlers subdirectory.
REM xcopy /y ..\bin\debug\TestCreatingProject.dll %EVENT_HANDLERS%
REM xcopy /y ..\bin\debug\TestCreatingProject.pdb %EVENT_HANDLERS%

REM To debug the event handler, register it in the global assembly cache.
gacutil /u TestCreatingProject
gacutil /i ..\bin\debug\TestCreatingProject.dll

Pour utiliser le fichier InstallEventHandler.bat pour 2 b de procédure, commenter les instructions des gacutil.exe et ne commentez pas les instructions de xcopy.

Inscription de l'Association de gestionnaire d'événements

Une fois l'assembly du Gestionnaire d'événements est déployé sur l'ordinateur de Project Server, vous devez l'associer à un événement dans Project Server avant de pouvoir utiliser le Gestionnaire d'événements. Procédure 3 montre comment inscrire le Gestionnaire d'événements TestCreatingProject à l'aide de Project Web App. Vous pouvez également créer une application à enregistrer des associations de gestionnaire d'événements, à l'aide du service Events dans la PSI.

Conseil

Pour un exemple d'application que vous pouvez ajouter et supprimer des associations de gestionnaire d'événements, consultez Outil Admin de Project Server 2007 événement Gestionnaire (éventuellement en anglais) sur CodePlex. Bien que l'outil a été conçu pour Office Project Server 2007, il fonctionne également avec Project Server 2010.

Procédure 3. Pour inscrire une association de gestionnaire d'événements dans un projet Web App

  1. Dans Project Web App, dans le menu de lancement rapide, cliquez sur Paramètres du serveur.

  2. Dans la page Paramètres du serveur, dans la section Stratégies opérationnelles , cliquez sur Gestionnaires d'événements de côté serveur.

  3. Dans la page de gestionnaires d'événements de côté serveur, faites défiler la liste Événements et cliquez sur le lien du Projet pour l'événement de Création et puis cliquez sur Nouveau gestionnaire d'événements (Figure 2).

    La figure 2. Ajout d'un gestionnaire d'événements création du projet

    Inscription du gestionnaire d’événement de création de projet

  4. Dans la page nouveau gestionnaire d'événements (Figure 3), tapez les valeurs suivantes pour les champs :

    1. Nom :  Le nom convivial pour le Gestionnaire d'événements.

    2. Description :  Une description facultative du Gestionnaire d'événements.

    3. Nom de l'assembly :  Le nom complet de l'assembly à partir du fichier texte que vous avez préparé à 2 bis procédure, par exemple :

      TestCreatingProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=92978aaaab03ff98
      
    4. Nom de classe :  Le nom qualifié complet de la classe dans l'assembly qui implémente le Gestionnaire d'événements, par exemple, Microsoft.SDK.Project.Samples.TestCreatingProject.CheckProjectDepartment.

    5. Ordre :  S'il existe plusieurs gestionnaires d'événements associés à un seul événement, le numéro d'ordre détermine l'ordre dans lequel les gestionnaires d'événements sont appelés. La valeur peut être comprise entre 1 et 999.

    La figure 3. Configuration d'un gestionnaire d'événements

    Configuration d’un nouveau gestionnaire d’événements dans Project Web App

  5. Cliquez sur Enregistrer.

    Notes

    Inscription d'événements est asynchrone et utilise l'application de service de Project Server et les processus de minuterie Microsoft SharePoint Foundation. Si la périodicité de la minuterie est une minute, elle peut prendre jusqu'à deux minutes pour inscrire le Gestionnaire d'événements avec Project Server.

  6. Vérifiez que l'événement est ajouté. Dans la liste Événements , cliquez de nouveau sur le lien du Projet pour l'événement de Création . Si l'inscription est terminée, vous devriez voir le Gestionnaire d'événements dans la liste des Gestionnaires d'événements .

Le sous-répertoire Utilities de la solution TestCreatingProject contient les informations suivantes dans le fichier EventHandlerRegistration.txt pour une utilisation dans la procédure 3 :

Add the following to the Edit Event Handler page in Project Web App,
for the Project Creating event.

Name: 
Project Creating Event Handler

Description: 
Test the OnCreating event handler for department requirements

Assembly Name (check the correct attributes after registering the event handler in the GAC): 
TestCreatingProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=92978aaaab03ff98

Class Name:
Microsoft.SDK.Project.Samples.TestCreatingProject.CheckProjectDepartment

Order:
1

Notes

Chaque fois que vous avez modifier et recompiler le code de gestionnaire d'événements, vous devez réinscrire le Gestionnaire d'événements (en utilisant la procédure 2 ou 2 b de procédure), supprimez le Gestionnaire d'événements dans la liste de Project Web App et puis ajoutez le Gestionnaire d'événements de mise à jour à l'aide d'une nouvelle procédure 3.

Le Gestionnaire d'événements de test: à l'aide de l'Observateur d'événements et le journaux ULS

Le Gestionnaire d'événements TestCreatingProject écrit un message au journal des événements et le journal de suivi ULS chaque fois qu'une application appelle la méthode QueueCreateProject. Fins de test exemple, si le service de projet est nommé Test Dept 2 contient plus de trois tâches, l'événement est annulé et le projet n'est pas créé.

Notes

Pour créer un projet, Project Professionnel 2010 appelle les méthodes du service WinProj privé de la PSI. Dans la mesure où il n'appelle pas QueueCreateProject, Project Professionnel 2010 ne déclenche pas l'événement de création du projet. Pour tester le Gestionnaire d'événements, vous pouvez utiliser une application personnalisée telle que ProjTool.exe ou de l'échantillon CreateProject4Department dans QueueCreateProject. Pour plus d'informations sur ProjTool, consultez Utilisation de l’application de test ProjTool dans Project Server 2010 (traduction automatique).

Procédure 4. Pour tester le Gestionnaire d'événements

  1. Activer des applications SharePoint enregistrer les entrées de journal de suivi ULS, comme suit :

    1. Ouvrez l'application Administration centrale de SharePoint 2010, cliquez sur Analyseet cliquez sur Examiner les définitions de travail dans la section de Travaux du minuteur de la page Monitoring.

    2. Cliquez sur fournisseur de données de Diagnostic : journal de suivi, puis sur la page Modifier le travail du minuteur, définissez le travail du minuteur pour exécuter toutes les 10 minutes. Cliquez sur OK. La figure 4 montre que le type de planification des journaux de suivi est Minutes.

      La figure 4. Définition du journal de suivi ULS

      Configuration du fichier journal de trace ULS

  2. Pour lire et analyser le journal ULS, facilement et pour filtrer des événements et enregistrer des exemples de journaux ULS, vous pouvez télécharger et installer la Visionneuse d'ULS (éventuellement en anglais) à partir de MSDN Code Gallery. Dans le cas contraire, vous pouvez afficher le journal d'ULS actuel dans le répertoire [Program Files]\Common Files\Microsoft Shared\Web Server Extensions\14\LOGS\ par défaut en utilisant le bloc-notes, ou copier le journal en cours vers un autre répertoire et afficher avec Microsoft Excel.

    Notes

    La visionneuse d'ULS n'est pas une application de prise en charge.

    1. Dans la fenêtre d'application de L'Observateur d'ULS , pour surveiller le journaux ULS en temps réel, appuyez sur Ctrl+U.

    2. Pour afficher uniquement les événements à partir du Gestionnaire d'événements TestCreatingProject et le service de file d'attente de Project Server, ajoutez un filtre où EventID est égal à 5050 ou la Catégorie est égal à la file d'attente. Vous pouvez enregistrer le filtre et puis charger le filtre lors de futures sessions.

  3. Car ProjTool n'ajoute pas directement une valeur de service lorsqu'il crée un projet, vous pouvez utiliser l'exemple CreateProject4Department dans le téléchargement du Kit de développement logiciel de Project 2010. Sinon, vous pouvez modifier ProjTool ou utilisez votre propre application pour créer des projets qui ont un service spécifié. Le reste de cette procédure utilise CreateProject4Department.exe.

    1. Sur la page champs personnalisés d'entreprise et des Tables de choix dans Project Web App, modifiez la table de choix de Service pour inclure un service nommé Test dept 2 (ou n'importe quelle valeur de texte dont vous disposez pour la constante PROJECT_DEPARTMENT2CHECK dans le code TestCreatingProject).

    2. Dans Microsoft SQL Server Management Studio, utilisez la requête suivante pour trouver la valeur de LT_STRUCT_UID de l'entrée de table de choix où le champ LT_VALUE_TEXT est dept Test 2.

      SELECT TOP 1000 [LT_UID]
            ,[LT_STRUCT_UID]
            ,[LT_VALUE_TEXT]
        FROM [ProjectServer_Published].[dbo].[MSP_LOOKUP_TABLE_VALUES]
      
    3. Copier la valeur de LT_STRUCT_UID dans la valeur de constante DEPARTMENT_TEST du code CreateProject4Department et ensuite, compilez l'application CreateProject4Department.

  4. Si vous utilisez l'Observateur d'ULS, assurez-vous qu'il est en cours d'exécution et collecte des entrées de trace en cours. Dans une fenêtre d'invite de commandes , exécutez CreateProject4Department.exe au moins deux fois : une fois pour créer un projet avec moins de trois tâches et une fois pour créer un projet avec plus de trois tâches. Les valeurs de paramètre name dans les commandes suivantes correspondent aux valeurs de nom du projet dans la Figure 5 et 6 de la Figure.

    CreateProject4Department -name "Test Proj4Dept 10" -tasks 3 
    CreateProject4Department -name "Test Proj4Dept 11" -tasks 4
    
  5. Ouvrez la fenêtre de Observateur d’événements , développez le nœud Journaux Windows et puis cliquez sur le journal Application . La source du Gestionnaire d'événements de projet (Figure 5) montre l'événement au niveau Informations pour le projet avec trois tâches. Le projet est créé.

    La figure 5. À l'aide de l'Observateur d'événements

    Utilisation de l’observateur d'événements

    L'événement de niveau Avertissement au-dessus de l'événement sélectionné affiche l'entrée de Gestionnaire d'événements de projet pour le cas avec les quatre tâches. L'événement de niveau Erreur indique que la file d'attente de Project Server a été bloquée lorsque la méthode QueueCreateProject n'a pas pu créer le projet.

  6. Dans la fenêtre de L'Observateur d'ULS (Figure 6), définir un filtre comme décrit dans l'étape 2 et puis cliquez sur l'élément de l'Avertissement du Gestionnaire d'événements . Le message indique que le projet avec les quatre tâches n'a pas été créé, et un peu plus tard un événement de la file d'attente critique est survenu.

    La figure 6. À l'aide de la visionneuse ULS avec un filtre

    Utilisation de l’observateur ULS

Le journal des événements et le journal d'ULS, vous trouverez des informations sur les travaux de la file d'attente de Project Server dans Project Web App. Par exemple, cliquez sur Paramètres personnels dans la barre de lancement rapide et puis cliquez sur Mes travaux en file d'attente. La figure 7 illustre les détails de l'erreur pour le travail de la file d'attente qui a échoué lorsque le Gestionnaire d'événements OnCreating annule l'événement. Le message d'événement critique de file d'attente dans l' Observateur d'ULS inclut la valeur de JobUID dans la boîte de dialogue Détails des erreurs de file d'attente de travail .

La figure 7. Application Web de projet montrant des détails de l'erreur dans un travail de la file d'attente

Détails des erreurs dans un travail de file d’attente

Le Gestionnaire d'événements de débogage

Inscrit l'événement gestionnaires s'exécutent sur l'ordinateur de Project Server et sont appelés par le service de gestion des événements Project Server. Pour déboguer un gestionnaire d'événements, vous pouvez utiliser Visual Studio 2010 et attacher le débogueur au processus de gestion des événements Project Server.

Conseil

Dans Project Server 2010, il existe deux processus de gestion des événements, qui sont le processus parent et enfant. Le processus parent génère le processus enfant et redémarre l'enfant s'il est arrêté. Le processus parent surveille également tout nouveau site Project Web App ou de projet qui est mis en service ou les sites qui sont supprimés et envoie un message d'actualisation pour le processus enfant.

Le processus de gestion des événements de l'enfant crée des récepteurs d'événements pour chaque site est approvisionné et démarre l'interrogation normale et la distribution des travaux. Le service de gestion des événements et le service de file d'attente utilisent le modèle de parent/enfant, il y a deux processus pour chaque service. Vous pouvez essayer de trouver qui est le processus enfant, mais il est plus facile de simplement attacher le débogueur à ces deux processus de gestion des événements.

Procédure 5. Pour déboguer le Gestionnaire d'événements

  1. Inscrivez-vous et tester le Gestionnaire d'événements comme décrit dans les procédures précédentes.

  2. Si vous déboguez à partir d'un ordinateur distant, consultez Remote Debugging Setup.

  3. Dans Visual Studio, ouvrez le projet de gestionnaire d'événements que vous avez enregistré et dans le menu Déboguer , cliquez sur attacher au processus.

  4. Dans la boîte de dialogue attacher au processus (Figure 8), sélectionnez le transport Par défaut et accédez à la nom de l'ordinateur de Project Server pour le champ qualificateur . Cliquez sur Sélectionneret dans la zone de la boîte de dialogue Sélectionner le Type de Code , sélectionnez managé pour l'option Déboguer ces types de code .

    La figure 8. Attachement du débogueur pour les processus de gestion des événements

    Attachement du débogueur au processus d’événements

  5. Sélectionnez la case à cocher Afficher les processus de tous les utilisateurs et la case à cocher Afficher les processus de toutes les sessions .

  6. Pour mettre Visual Studio en mode débogage, dans la liste Processus disponibles , sélectionnez les deux procédures Microsoft.Office.Project.Server.Eventing.exe et puis cliquez sur Attacher.

  7. Dans le menu Outils , cliquez sur Options. Développez le nœud débogage dans la liste options, cliquez sur Symboles. Cliquez sur l'icône de dossier et collez le chemin de répertoire de build TestCreatingProject projet debug dans le nouvel emplacement du fichier de symboles. Cliquez sur charger tous les symboles pour charger le fichier de symboles TestCreatingProject.pdb et puis cliquez sur OK.

  8. Dans la fenêtre code du fichier TestCreatingProject.cs, placez un point d'arrêt à l'instruction PSSchema.ProjectDataSet projDs = e.ProjectDataSet;, ou n'importe où ailleurs que vous souhaitez démarrer le débogage.

    Si le point d'arrêt n'indique qu'un contour rouge avec un symbole d'avertissement jaune, le fichier de symboles TestCreatingProject.pdb n'est pas chargé ou Project Server n'a pas terminé l'enregistrement du Gestionnaire d'événements. Assurez-vous que les paramètres de surimpression événement Gestionnaire de Project Web App sont corrects et réessayez l'étape 9 pour démarrer la gestion des événements traiter le travail.

  9. Déclenche l'événement Creating en exécutant l'application CreateProject4Department et étape puis via le Gestionnaire d'événements OnCreating dans Visual Studio.

  10. Le débogage ne fonctionne pas si vous modifiez le code et recompilez après l'enregistrement du Gestionnaire d'événements avec Project Server. Si vous recompilez, vous devez réenregistrer le Gestionnaire d'événements recompilés comme suit :

    1. Supprimer le Gestionnaire d'événements dans Project Web App.

    2. Supprimez l'ancien assembly du Gestionnaire d'événements dans le global assembly cache.

    3. Inscrire le Gestionnaire d'événements recompilés dans le global assembly cache.

    4. Réinscrivez le Gestionnaire d'événements dans Project Web App.

Notes

Avertissement traduction automatique : cet article a été traduit par un ordinateur, sans intervention humaine. Microsoft propose cette traduction automatique pour offrir aux personnes ne maîtrisant pas l’anglais l’accès au contenu relatif aux produits, services et technologies Microsoft. Comme cet article a été traduit automatiquement, il risque de contenir des erreurs de grammaire, de syntaxe ou de terminologie.

Programmation fiable

Notes

Les exemples de code dans cet article n'incluent pas les blocs de trycatch pour le System.ServiceModel.FaultException WCF et d'autres exceptions. Code de production doit inclure la gestion des exceptions, où les exceptions sont écrits dans le journal de suivi ULS.

Pour obtenir un exemple de la FaultException de recouvrement, consultez l'exemple WCF dans QueueCreateProject. La solution CreateProject4Department dans le Project 2010 télécharger SDK implémente également la gestion des exceptions.

Le niveau de message d'erreur ULS dans l'exemple est défini à TraceSeverity.Unexpected dans la méthode LoggingService.LogError. Ce niveau est généralement utilisé pour des exceptions inattendues qui se produisent dans des blocs de try-catch. Vous devez créer plusieurs méthodes plus dans la classe LoggingService qui ont un plus grand nombre de niveaux de TraceSeverity. Par exemple, avec un FaultException, consigner un message de niveau High, avec une Exception générale inattendue de consigner un message Unexpected et avec un gestionnaire pré-événementiel qui annule l'événement mais le fait d'aucun dommage réel, comme dans l'exemple TestCreatingProject, consigner un message de niveau de Medium.

Voir aussi

Tâches

Procédure pas à pas : Développement d’applications PSI à l’aide de WCF (traduction automatique)

Référence

PSEventID

QueueCreateProject

Concepts

Utilisation de l’application de test ProjTool dans Project Server 2010 (traduction automatique)

Autres ressources

Project Server Events

Gestionnaire d'événement d'Audit de délégation 2010 Project Server (éventuellement en anglais)

de l'outil du Gestionnaire d'événements Admin Project Server 2007 (éventuellement en anglais)

ULS Viewer (éventuellement en anglais)

Écriture dans le journal de suivi à partir de code personnalisé

Fonctionnalités de débogage et de journalisation dans SharePoint 2010

Remote Debugging Setup