Aujourd’hui je suis tombé sur un problème étrange : dans une solution SharePoint de type Sandbox, je créé une Activité (ou action) de Workflow en suivant ce tuto :
http://msdn.microsoft.com/en-us/library/ff798499.aspx
Je rajoute mon élément de type “WorkflowActions” à une feature de scope site existante.
A l’activation via Powershell, j’ai l’erreur suivante :
Unable to cast object of type 'Microsoft.SharePoint.SPFieldElement' to type 'Microsoft.SharePoint.SPWorkflowActionsElement'.
Après quelques jurons, c’est finalement le debuggeur de VS2010 et Reflector (encore) qui me donnent la voie :
Avec Visual Studio, je me suis accroché à Powershell et à l’activation de la feature en question, j’ai pu voir où ça plantait :
> Microsoft.SharePoint.dll!Microsoft.SharePoint.Administration.SPElementDefinitionCollection.ProvisionWorkflowActions(Microsoft.SharePoint.SPFeaturePropertyCollection props, Microsoft.SharePoint.SPSite site, Microsoft.SharePoint.SPWeb web, bool fForce)
Voici le code en question, en utilisant Reflector :
1: private void ProvisionWorkflowActions(SPFeaturePropertyCollection props, SPSite site, SPWeb web, bool fForce)
2: {
3: foreach (SPWorkflowActionsElement element in (IEnumerable) this)
4: {
5: try
6: {
7: element.ElementActivated(props, null, null, site, web, fForce);
8: continue;
9: }
10: catch (Exception exception)
11: {
12: ULS.SendTraceTag(0x67306777, ULSCat.msoulscat_WSS_FeaturesInfrastructure, ULSTraceLevel.High, "{0}", new object[] { string.Format(CultureInfo.InvariantCulture, "The element{0} of type '{1}' for feature '{2}' (id: {3}) threw an exception during activation: {4}", new object[] { (element.Id != null) ? (" '" + element.Id + "'") : null, element.ElementType, this.ParentFeatureDefinition.DisplayName, this.ParentFeatureDefinition.Id, exception.Message }) });
13: props.Feature.HandleProvisioningException(exception, fForce);
14: continue;
15: }
16: }
17: }
18:
Ce code (ligne 3) suppose que tous les éléments dans SPElementDefinitionCollection sont de type SPWorkflowActionsElement. Et c’est ce qui plante.
Si on regarde les autres méthodes de cette classe, on se rend compte qu’il y a une différence : exemple (SPDocumentConverterElement) :
1: private void ProvisionDocumentConverters(SPFeaturePropertyCollection props, SPWebApplication webapp, bool fForce)
2: {
3: foreach (SPElementDefinition definition in (IEnumerable) this)
4: {
5: if (definition is SPDocumentConverterElement)
6: {
7: try
8: {
9: //...
10: }
11: }
12: }
13: }
On peut en effet observer qu’on ne récupère que les éléments de type SPDocumentConverterElement, sans que ça plante…
Conclusion : pour que ça fonctionne il suffit d’isoler l’ajout d’une action de workflow dans une feature à part.
Je suis assez surpris car je n’ai pas lu cette information sur le net, et ce fonctionnement est différent des autres éléments de features…
Bref, que du bonheur…