Heute stellt ich fest, dass mein Genehmigungsworkflow, wenn er mit gewissen Parametern geladen wird, nicht anläuft. Im Front-End erschien weder ein Fehler, noch hat sich der Workflow beendet. Es schien fast so, als würde er ab einem gewissen Punkt einfach nicht weiter laufen.
Ich habe dann erst einmal das Workflow-Tracing aktiviert. Hierfür werden der folgende Abschnitt in die web.config der SharePoint Instanzt eingefügt:
<system.diagnostics> <switches> <add name="System.Workflow LogToFile" value="1" /> <add name="System.Workflow.Runtime" value="All" /> <add name="System.Workflow.Runtime.Hosting" value="All" /> <add name="System.Workflow.Runtime.Tracking" value="All" /> <add name="System.Workflow.Activities" value="All" /> <add name="System.Workflow.Activities.Rules" value="All" /> </switches> </system.diagnostics>
Darauf wird im Ordner C:\Windows\System32\inetsrv die Datei workflowtrace.log angelegt. Sollte die Log-Datei nicht automatisch angelegt werden, kann das an den Berechtigungen liegen. In diesem Fall einfach von Hand eine leere Datei mit diesem Namen anlegen.
Nachdem ich den fehlerhaften Workflow erneut gestartet habe, fand ich die beiden folgenden Fehler im Log:
System.Workflow.Runtime Error: 1 : Execute of Activity ID1419 threw System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> Microsoft.SharePoint.WorkflowActions.CoercionException: Koersionsfehler: <strong>Die Eingabe darf für diese Koersion nicht null sein..</strong> bei Microsoft.SharePoint.WorkflowActions.Helper.SplitMultiAndExtract(WorkflowContext context, Object val, ToExtract toExtract) bei Microsoft.SharePoint.WorkflowActions.Helper.SplitMultiUserToObjects(WorkflowContext context, Object val) bei Microsoft.SharePoint.WorkflowActions.Helper.MultiDisplayNameSemicolon(WorkflowContext context, Object val) --- Ende der internen Ausnahmestapelüberwachung --- bei System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) bei System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) bei System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) bei Microsoft.SharePoint.WorkflowActions.CoerceActivity.Coerce() bei Microsoft.SharePoint.WorkflowActions.CoerceActivity.Execute(ActivityExecutionContext provider) bei System.Workflow.ComponentModel.ActivityExecutorOperation.Run(IWorkflowCoreRuntime workflowCoreRuntime)
Einige Zeilen später:
System.Workflow.Runtime Error: 0 : Workflow Runtime: WorkflowExecutor: Persist attempt on instance '0e5bbd06-0162-4cd3-b1ba-d3eff2c70e6d' threw an exception 'Der Typ "Microsoft.SharePoint.WorkflowActions.CoercionException" in Assembly "Microsoft.SharePoint.WorkflowActions, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" ist nicht als serialisierbar gekennzeichnet.' at bei System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) bei System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) bei System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph) bei System.Workflow.ComponentModel.Activity.Save(Stream stream, IFormatter formatter) bei System.Workflow.Runtime.Hosting.WorkflowPersistenceService.GetDefaultSerializedForm(Activity activity) bei Microsoft.SharePoint.Workflow.SPWinOePersistenceService.SaveWorkflowInstanceState(Activity instanceState, Boolean unlock) bei System.Workflow.Runtime.WorkflowExecutor.Persist(Activity dynamicActivity, Boolean unlock, Boolean needsCompensation)
Der für mich wichtigste Hinweis war: Die Eingabe darf für diese Koersion nicht null sein.
Nach einer intensiven Prüfung des Workflows stellt ich fest, dass ein LookUp-Feld keinen Datensatz in seiner referenzierten SharePoint-Liste gefunden hatte und deshalb NULL war. Dieser leere Wert konnte dann vom Workflow nicht weiter verarbeitet werden und er stellt seine Arbeit ein. Yeah!