Complemento de SharePoint de ejemplo de etiquetado automático
El ejemplo ECM.AutoTagging muestra cómo usar un complemento hospedado por el proveedor para etiquetar automáticamente contenido agregado a una biblioteca de SharePoint con datos que proceden de una propiedad de perfil de usuario personalizada.
Este complemento usa receptores de eventos remotos, hospedados en un sitio web de Azure, para:
- Crear campos, tipos de contenido y bibliotecas de documentos.
- Recuperar el valor de una propiedad de perfil de usuario personalizada.
- Establecer campos de taxonomía.
Use esta solución si quiere:
- Implementar receptores de eventos en SharePoint Online.
- Mejorar los resultados de búsqueda mediante la asociación de metadatos adicionales al contenido en el momento en que se crea.
- Clasificar el contenido.
- Modernizar el código antes de migrar a una versión más reciente de SharePoint y ha usado receptores de eventos que anteriormente.
Antes de empezar
Para empezar, descargue el complemento de prueba ECM.AutoTagging desde el proyecto Modelos y prácticas de desarrollo de Office 365 en GitHub.
Nota:
El código de este artículo se proporciona tal cual, sin garantía de ningún tipo, expresa o implícita, incluidas las garantías implícitas de aptitud para un propósito particular, comerciabilidad o ausencia de infracción.
Antes de ejecutar este complemento, siga estos pasos:
Cree un sitio web de Azure e implemente el proyecto ECM.AutoTaggingWeb en él.
Registre el complemento mediante la página de Appregnew.aspx en Office 365.
Este complemento usa permisos solo para la aplicación. Debe asignar permisos solo para la aplicación con la página AppInv.aspx en Office 365. Copie el siguiente código XML del archivo AppManifest.xml al cuadro XML de solicitud de permiso en la página AppInv.aspx, como se muestra en la siguiente ilustración.
<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>
En el proyecto ECM.AutoTaggingWeb, en el archivo ReceiverHelper.cs, en el método CreateEventReciever, actualice la propiedad ReceiverUrl con la dirección URL de su sitio web de Azure.
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; }
Empaquete e implemente el complemento.
Al iniciar el complemento, se muestra la página de inicio del complemento hospedado por el proveedor de etiquetado automático de documentos, como se muestra en la siguiente ilustración. La página de inicio muestra algunos pasos de configuración adicionales que debe realizar antes de asignar o quitar los receptores de evento.
Usar el complemento de ejemplo ECM.AutoTagging
En este ejemplo se usa un receptor de eventos remoto para etiquetar automáticamente (agregar metadatos a) documentos que se agregan a una biblioteca de documentos, con los datos de una propiedad de perfil de usuario personalizada.
En la siguiente ilustración, se muestra el flujo del proceso para etiquetar automáticamente documentos con el receptor de eventos remoto.
Para asignar metadatos al documento recién creado en la biblioteca de documentos mediante un receptor de eventos remoto:
Un usuario crea o carga nuevo contenido a una biblioteca de documentos. Se asigna un receptor de eventos remoto para administrar eventos ItemAdding o ItemAdded en esta biblioteca de documentos.
El método ItemAdding o ItemAdded realiza una llamada al receptor de eventos remoto.
El complemento hospedado por el proveedor busca el valor de una propiedad de perfil de usuario personalizada en el servicio de perfiles de usuario de SharePoint para ese usuario. En este ejemplo de complemento, se recupera la propiedad de perfil de usuario de clasificación personalizada que se ha agregado anteriormente.
El receptor de eventos remoto actualiza los metadatos en el nuevo documento con el valor de la propiedad de perfil de usuario personalizada del usuario.
Botón Ejecutar escenario 1
Cuando selecciona el botón Ejecutar escenario 1, el complemento hace lo siguiente:
Crea una biblioteca de documentos
Crea el receptor de eventos remoto para el evento ItemAdding.
Nota:
Este artículo describe el tipo de receptor de eventos ItemAdding. Por lo general, el tipo de receptor de eventos ItemAdding funciona mejor que el tipo de receptor de eventos ItemAdded. El ejemplo ECM.AutoTagging proporciona código para los tipos de receptor de eventos ItemAdding y ItemAdded.
Agrega el receptor de eventos remoto a la biblioteca de documentos.
El siguiente código, en el método btnScenario1_Click de la página Default.aspx.cs en el proyecto ECM.AutoTaggingWeb, muestra estos pasos.
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)
{
}
}
}
Se realiza una llamada al método CreateContosoDocumentLibrary. El siguiente código en el archivo ScenarioHandler.cs utiliza métodos de OfficeDevPnP.Core para crear una biblioteca de documentos personalizada con un tipo de contenido personalizado. Se quita el tipo de contenido predeterminado en la biblioteca de documentos.
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.");
}
}
Después de ejecutar este código, se crea la biblioteca de documentos AutoTaggingSampleItemAdding en el sitio Contents4.
En el proyecto ECM.AutoTaggingWeb, en el archivo ReceiverHelper.cs, el método CreateEventReciever crea la definición del receptor de eventos ItemAdding. En el proyecto ECM.AutoTaggingWeb, la carpeta de servicios incluye un servicio web llamado AutoTaggingService.svc. Cuando publicó el proyecto ECM.AutoTaggingWeb en su sitio web de Azure, este servicio web también se implementó en el sitio. El método CreateEventReciever asigna este servicio web como receptor de eventos remoto en la biblioteca de documentos.
El siguiente código del método CreateEventReciever muestra cómo asignar el servicio web al receptor de eventos remoto.
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;
}
El siguiente código del método AddEventReceiver asigna el receptor de eventos remoto a la biblioteca de documentos.
public static void AddEventReceiver(ClientContext ctx, List list, EventReceiverDefinitionCreationInformation eventReceiverInfo)
{
if (!DoesEventReceiverExistByName(ctx, list, eventReceiverInfo.ReceiverName))
{
list.EventReceivers.Add(eventReceiverInfo);
ctx.ExecuteQuery();
}
}
Ahora se agrega el receptor de eventos remoto a la biblioteca de documentos. Al cargar un documento en la biblioteca de documentos AutoTaggingSampleItemAdding, el documento se etiqueta con el valor de la propiedad personalizada de perfil de usuario de Clasificación del usuario.
La figura siguiente muestra cómo ver las propiedades de un documento.
La figura siguiente muestra los metadatos del documento con el campo de Clasificación.
El método HandleAutoTaggingItemAdding del archivo AutoTaggingService.svc.cs usa el método GetProfilePropertyFor para recuperar el valor de la propiedad de perfil de usuario de Clasificación.
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);
}
}
}
}
}
> [! IMPORTANTE] > Después de recuperar el valor **Classification** del método **GetProfilePropertyFor**, el valor **Classification** debe tener un formato determinado antes de que se pueda almacenar como metadatos en el documento. El método **GetTaxonomyFormat** del archivo AutoTaggingHelper.cs muestra cómo dar formato al valor **Classification**.
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;
}
Botón Quitar escenario de evento 1
Cuando selecciona el botón Quitar escenario de evento 1, el siguiente código se ejecuta para quitar el receptor de eventos de la biblioteca de documentos.
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();
}
}