Freigeben über


Automatisches Tagging des Beispiel-SharePoint-Add-Ins

Im ECM.AutoTagging-Beispiel wird gezeigt, wie ein vom Anbieter gehostetes Add-In verwendet wird, um Inhalte, die einer SharePoint-Bibliothek hinzugefügt wurden, automatisch mit Daten aus einer benutzerdefinierten Benutzerprofileigenschaft markiert werden.

Dieses Add-In verwendet Remoteereignisempfänger, die auf einer Azure-Website gehostet werden, um:

  • Felder, Inhaltsypen und Dokumentbibliotheken zu erstellen.
  • Den Wert einer benutzerdefinierten Benutzerprofileigenschaft abzurufen.
  • Taxonomiefelder festzulegen.

Verwenden Sie diese Lösung, wenn Sie die folgenden Aufgaben ausführen möchten:

  • Implementieren von Remoteereignisempfängern in SharePoint Online.
  • Verbessern der Suchergebnisse durch Anfügen zusätzlicher Metadaten an Inhalte bei der Erstellung.
  • Kennzeichnen Ihrer Inhalte.
  • Modernisieren Ihres Codes vor der Migration auf eine neuere Version von SharePoint, wenn Sie bisher Ereignisempfänger verwendet haben.

Bevor Sie beginnen

Laden Sie zunächst das ECM.AutoTagging-Beispiel-Add-In aus dem Projekt "Office 365-Entwicklermuster und -vorgehensweisen" auf GitHub herunter.

Hinweis

Der Code in diesem Artikel wird wie besehen und ohne jegliche Garantie zur Verfügung gestellt, gleich ob ausdrücklich oder konkludent, einschließlich jedweder stillschweigenden Gewährleistung der Eignung für einen bestimmten Zweck, Marktgängigkeit oder Nichtverletzung von Rechten.

Bevor Sie dieses Add-In ausführen, führen Sie folgende Schritte aus:

  1. Erstellen Sie eine Azure-Website, und stellen Sie das ECM.AutoTaggingWeb-Projekt darauf bereit.

  2. Registrieren Sie das Add-In mithilfe der Seite „Appregnew.aspx“ in Office 365.

  3. Dieses Add-In verwendet Nur-App-Berechtigungen. Sie müssen Nur-App-Berechtigungen mithilfe der Seite „AppInv.aspx“ in Office 365 zuweisen. Kopieren Sie den folgenden XML-Code aus der Datei „AppManifest.xml“ in das Feld Berechtigunganforderungs-XML auf der Seite „AppInv.aspx“, wie in der folgenden Abbildung gezeigt.

       <AppPermissionRequests AllowAppOnlyPolicy="true">
         <AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl" />
         <AppPermissionRequest Scope="http://sharepoint/taxonomy" Right="Read" />
         <AppPermissionRequest Scope="http://sharepoint/social/tenant" Right="Read" />
       </AppPermissionRequests>
    

    Screenshot der AppInv.aspx-Seite mit hervorgehobenen App-ID- und Berchtigungsanforderungs-XML-Feldern.

  4. Aktualisieren Sie im ECM.AutoTaggingWeb-Projekt in der Datei „ReceiverHelper.cs“ in der CreateEventReciever-Method die ReceiverUrl-Eigenschaft mit der URL Ihrer Azure-Website.

         public static EventReceiverDefinitionCreationInformation CreateEventReciever(string receiverName, EventReceiverType type)
             {
    
                 EventReceiverDefinitionCreationInformation _rer = new EventReceiverDefinitionCreationInformation();
                 _rer.EventType = type;
                 _rer.ReceiverName = receiverName;
                 _rer.ReceiverClass = "ECM.AutoTaggingWeb.Services.AutoTaggingService";
                 _rer.ReceiverUrl = "https://<Your domain>.azurewebsites.net/Services/AutoTaggingService.svc";
                 _rer.Synchronization = EventReceiverSynchronization.Synchronous;
                 return _rer;
             }
    
    

  5. Verpacken Sie das Add-In und stellen Sie es bereit.

Wenn Sie das Add-in starten, wird die Startseite des vom Anbieter gehosteten Add-Ins für das automatische Tagging des Dokuments angezeigt, wie in der folgenden Abbildung dargestellt. Die Startseite zeigt einige zusätzliche Konfigurationsschritte, die Sie vor dem Zuweisen oder der Entfernen der Ereignisempfänger ausführen müssen.

Screenshot der Autotagging-Add-In-Startseite mit drei hervorgehobenen Einrichtungsschritten.

Verwenden des ECM. Autotagging-Beispiel-Add-Ins

In diesem Beispiel wird ein Remoteereignisempfänger verwendet, um Dokumente, die einer Dokumentbibliothek hinzugefügt werden, mit Daten aus einer benutzerdefinierten Benutzerprofileigenschaft zu kennzeichnen (d.h. Metadaten hinzuzufügen).

In der folgenden Abbildung ist der Prozessablauf für das automatische Tagging von Dokumenten mithilfe des Remoteereignisempfängers dargestellt.

Abbildung des Prozesses zum Markieren eines Dokuments in einer Bibliothek. Wenn der Benutzer Inhalte erstellt, kontaktiert das Add-In den Ereignisempfänger, der auf das Profil des Benutzers zugreift und Informationen an SharePoint übermittelt.

Gehen Sie folgendermaßen vor, um dem neu erstellten Dokument in der Dokumentbibliothek mithilfe eines Remoteereignisempfängers Metadaten zuzuweisen:

  1. Ein Benutzer erstellt neue Inhalte oder lädt neue Inhalte in eine Dokumentbibliothek hoch. Ein Remoteereignisempfänger wird zum Behandeln des ItemAdding- oder ItemAdded-Ereignisses in dieser Dokumentbibliothek hinzugefügt.

  2. Die ItemAdding-oder ItemAdded-Methode ruft den Remoteereignisempfänger auf.

  3. Das vom Anbieter gehostete Add-In ruft den Wert einer benutzerdefinierten Benutzerprofileigenschaft im SharePoint-Benutzerprofildienst für diesen Benutzer ab. In diesem Beispiel-Add-In wird die benutzerdefinierte Benutzerprofileigenschaft "Klassifizierung" abgerufen, die zuvor hinzugefügt wurde.

  4. Der Remoteereignisempfänger aktualisiert die Metadaten für das neue Dokument mit dem Wert der benutzerdefinierten Benutzerprofileigenschaft für diesen Benutzer.

Schaltfläche zum Ausführen von Szenario 1

Wenn Sie die Schaltfläche Szenario 1 ausführen auswählen, führt das Add-In die folgenden Aufgaben aus:

  1. Es erstellt eine Dokumentbibliothek.

  2. Es erstellt den Remoteereignisempfänger für das ItemAdding-Ereignis.

    Hinweis

    In diesem Artikel wird der ItemAdding-Ereignisempfängertyp beschrieben. Im Allgemeinen weist der ItemAdding-Ereignisempfänger eine bessere Leistung als der ItemAdded-Ereignisempfängertyp auf. Das ECM.AutoTagging-Beispiel bietet Code sowohl für den ItemAdding- als auch für den ItemAdded-Ereignisempfängertyp.

  3. Es fügt den Remoteereignisempfänger zu der Dokumentbibliothek hinzu.

Der folgende Code in der btnScenario1_Click-Methode der Seite „Default.aspx.cs“ im ECM.AutoTaggingWeb-Projekt zeigt diese Schritte.

protected void btnScenario1_Click(object sender, EventArgs e)
        {
            var _libraryToCreate = this.GetLibaryInformationItemAdding();
 
            var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
            using (var ctx = spContext.CreateUserClientContextForSPHost())
            {
                try 
                { 
                    if(!ctx.Web.ListExists(_libraryToCreate.Title))
                    {
                        ScenarioHandler _scenario = new ScenarioHandler();
                        _scenario.CreateContosoDocumentLibrary(ctx, _libraryToCreate);
                    }
                    List _list = ctx.Web.Lists.GetByTitle(_libraryToCreate.Title);
                    EventReceiverDefinitionCreationInformation _rec = ReceiverHelper.CreateEventReciever(ScenarioHandler.AUTOTAGGING_ITEM_ADDING_RERNAME, EventReceiverType.ItemAdding);
                    ReceiverHelper.AddEventReceiver(ctx, _list, _rec);
                }
                catch(Exception _ex)
                {

                }
            }
        }  

Die CreateContosoDocumentLibrary-Methode wird aufgerufen. Der folgende Code in der Datei „ScenarioHandler.cs“ verwendet Methoden aus OfficeDevPnP.Core, um eine benutzerdefinierte Dokumentbibliothek mit einem benutzerdefinierten Inhaltstyp zu erstellen. Der Standardinhaltstyp in der Dokumentbibliothek wird entfernt.

public void CreateContosoDocumentLibrary(ClientContext ctx, Library library)
        {
            // Check the fields.
            if (!ctx.Web.FieldExistsById(FLD_CLASSIFICATION_ID))
            {
                ctx.Web.CreateTaxonomyField(FLD_CLASSIFICATION_ID,
                                            FLD_CLASSIFICATION_INTERNAL_NAME,
                                            FLD_CLASSIFICATION_DISPLAY_NAME,
                                            FIELDS_GROUP_NAME,
                                            TAXONOMY_GROUP,
                                            TAXONOMY_TERMSET_CLASSIFICATION_NAME);
            }

            // Check the content type.
            if (!ctx.Web.ContentTypeExistsById(CONTOSODOCUMENT_CT_ID))
            {
                ctx.Web.CreateContentType(CONTOSODOCUMENT_CT_NAME,
                                          CT_DESC, CONTOSODOCUMENT_CT_ID,
                                          CT_GROUP);
            }

            // Associate fields to content types.
            if (!ctx.Web.FieldExistsByNameInContentType(CONTOSODOCUMENT_CT_NAME, FLD_CLASSIFICATION_INTERNAL_NAME))
            {
                ctx.Web.AddFieldToContentTypeById(CONTOSODOCUMENT_CT_ID,
                                                  FLD_CLASSIFICATION_ID.ToString(),
                                                  false);
            }

            
            CreateLibrary(ctx, library, CONTOSODOCUMENT_CT_ID);
        }

private void CreateLibrary(ClientContext ctx, Library library, string associateContentTypeID)
        {
            if (!ctx.Web.ListExists(library.Title))
            {
                ctx.Web.AddList(ListTemplateType.DocumentLibrary, library.Title, false);
                List _list = ctx.Web.GetListByTitle(library.Title);
                if (!string.IsNullOrEmpty(library.Description))
                {
                    _list.Description = library.Description;
                }

                if (library.VerisioningEnabled)
                {
                    _list.EnableVersioning = true;
                }

                _list.ContentTypesEnabled = true;
                _list.RemoveContentTypeByName("Document");
                _list.Update();
                
     
                ctx.Web.AddContentTypeToListById(library.Title, associateContentTypeID, true);
                ctx.Web.Context.ExecuteQuery();
               
            }
            else
            {
                throw new Exception("A list, survey, discussion board, or document library with the specified title already exists in this website.  Please choose another title.");
            }
        }

Nachdem dieser Code ausgeführt wird, wird die AutoTaggingSampleItemAdding-Dokumentbibliothek in der Website „Contents4“ erstellt.

Screenshot der Seite


Im ECM.AutoTaggingWeb-Projekt in der Datei „ReceiverHelper.cs“ erstellt die CreateEventReciever-Methode die ItemAdding-Ereignisempfängerdefinition. Im ECM.AutoTaggingWeb-Projekt umfasst der Ordner „Services“ einen Webdienst mit dem Namen „AutoTaggingService.svc“. Wenn Sie das ECM.AutoTaggingWeb-Projekt auf Ihrer Azure-Website veröffentlicht haben, wurde dieser Webdienst auch auf der Website bereitgestellt. Die CreateEventReciever-Methode weist diesem Webdienst den Remoteereignisempfänger in der Dokumentbibliothek zu.

Der folgende Code aus der CreateEventReciever-Methode veranschaulicht, wie der Webdienst dem Remoteereignisempfänger zugewiesen wird.

public static EventReceiverDefinitionCreationInformation CreateEventReciever(string receiverName, EventReceiverType type)
        {

            EventReceiverDefinitionCreationInformation _rer = new EventReceiverDefinitionCreationInformation();
            _rer.EventType = type;
            _rer.ReceiverName = receiverName;
            _rer.ReceiverClass = "ECM.AutoTaggingWeb.Services.AutoTaggingService";
            _rer.ReceiverUrl = "https://<Your domain>.azurewebsites.net/Services/AutoTaggingService.svc";
            _rer.Synchronization = EventReceiverSynchronization.Synchronous;
            return _rer;
        }


Im folgenden Code aus der AddEventReceiver-Methode wird der Remoteereignisempfänger dem Dokument zugewiesen.

public static void AddEventReceiver(ClientContext ctx, List list, EventReceiverDefinitionCreationInformation eventReceiverInfo)
        {
            if (!DoesEventReceiverExistByName(ctx, list, eventReceiverInfo.ReceiverName))
            {
                list.EventReceivers.Add(eventReceiverInfo);
                ctx.ExecuteQuery();
            }
        }


Nun wird der Remoteereignisempfänger zu der Dokumentbibliothek hinzugefügt. Beim Hochladen eines Dokuments in die AutoTaggingSampleItemAdding-Dokumentbibliothek wird das Dokument mit dem Wert der benutzerdefinierten Benutzerprofileigenschaft "Klassifizierung" für diesen Benutzer markiert.

Die folgende Abbildung zeigt, wie Sie die Eigenschaften in einem Dokument anzeigen.

Screenshot eines Testdokuments in der Bibliothek mit erweiterten Eigenschaften.


Die folgende Abbildung zeigt die Metadaten des Dokuments mit dem Feld "Klassifizierung".

Screenshot der Metadaten des Testdokuments mit HBI im Feld


Die HandleAutoTaggingItemAdding-Methode in der Datei „AutoTaggingService.svc.cs“ verwendet die GetProfilePropertyFor-Methode, um den Wert der Benutzerprofileigenschaft „Klassifizierung“ abzurufen.

public void HandleAutoTaggingItemAdding(SPRemoteEventProperties properties,SPRemoteEventResult result)
        {
            using (ClientContext ctx = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
            {
                if (ctx != null)
                {
                    var itemProperties = properties.ItemEventProperties;
                    var _userLoginName = properties.ItemEventProperties.UserLoginName;
                    var _afterProperites = itemProperties.AfterProperties;
                    if(!_afterProperites.ContainsKey(ScenarioHandler.FLD_CLASSIFICATION_INTERNAL_NAME))
                    {
                        string _classficationToSet = ProfileHelper.GetProfilePropertyFor(ctx, _userLoginName, Constants.UPA_CLASSIFICATION_PROPERTY);
                        if(!string.IsNullOrEmpty(_classficationToSet))
                        { 
                            var _formatTaxonomy = AutoTaggingHelper.GetTaxonomyFormat(ctx, _classficationToSet);
                            result.ChangedItemProperties.Add(ScenarioHandler.FLD_CLASSIFICATION_INTERNAL_NAME, _formatTaxonomy);
                        }
                    }
                }
            }
        }


> [! WICHTIG] > Nach dem Abrufen des **Classification**-Werts aus der **GetProfilePropertyFor**-Methode muss der **Classification**-Wert auf eine bestimmte Weise formatiert werden, bevor er als Metadaten im Dokument gespeichert werden kann. Die **GetTaxonomyFormat**-Methode in der Datei AutoTaggingHelper.cs zeigt, wie der **Classification**-Wert formatiert wird.
public static string GetTaxonomyFormat(ClientContext ctx, string term)
        { 
            if(string.IsNullOrEmpty(term))
            {
                throw new ArgumentException(string.Format(EXCEPTION_MSG_INVALID_ARG, "term"));
            }
            string _result = string.Empty;
            var _list = ctx.Web.Lists.GetByTitle(TAXONOMY_HIDDEN_LIST_NAME);
            CamlQuery _caml = new CamlQuery();

            _caml.ViewXml = string.Format(TAXONOMY_CAML_QRY, term);
            var _listItemCollection = _list.GetItems(_caml);

            ctx.Load(_listItemCollection,
                eachItem => eachItem.Include(
                    item => item,
                    item => item.Id,
                    item => item[TAXONOMY_FIELDS_IDFORTERM]));
            ctx.ExecuteQuery();

            if (_listItemCollection.Count > 0)
            {
                var _item = _listItemCollection.FirstOrDefault();
                var _wssId = _item.Id;
                var _termId = _item[TAXONOMY_FIELDS_IDFORTERM].ToString(); ;
                _result = string.Format(TAXONOMY_FORMATED_STRING, _wssId, term, _termId);
            }

            return _result;
        }

Schaltfläche zum Entfernen von Ereignisszenario 1

Beim Auswählen der Schaltfläche Ereignisszenario 1 entfernen wird der folgende Code ausgeführt, um den Remoteereignisempfänger aus der Dokumentbibliothek zu entfernen.

public static void RemoveEventReceiver(ClientContext ctx, List list, string receiverName)
        {
            ctx.Load(list, lib => lib.EventReceivers);
            ctx.ExecuteQuery();

            var _rer = list.EventReceivers.Where(e => e.ReceiverName == receiverName).FirstOrDefault();
            if(_rer != null)
            {
                _rer.DeleteObject();
                ctx.ExecuteQuery();
            }
        }

Siehe auch