示例#1
0
        public HttpResponseMessage <string> Run(string idOrAlias, [FromBody] List <ParameterValue> values, bool trace = false)
        {
            using (Profiler.Measure("WorkflowController.Run"))
            {
                MDL.EntityRef eid = GetId(idOrAlias);

                var workflow = MDL.Entity.Get <MDL.Workflow>(eid);

                var parameterValues = new Dictionary <string, object>( );                // { { "ResourceId", new EntityRef(resourceId) } };

                using (new SecurityBypassContext())
                {
                    if (values != null)
                    {
                        foreach (ParameterValue kv in values)
                        {
                            EventLog.Application.WriteTrace("Running workflow {0} with {1}={2} ({3})", eid.Id, kv.Name,
                                                            kv.Value, kv.TypeName);

                            var argType = MDL.Entity.Get <MDL.ArgumentType>(kv.TypeName, MDL.ArgumentType.InternalDisplayName_Field);

                            switch (argType.Alias)
                            {
                            case "core:objectArgument":
                                throw new ApplicationException("Object arguments not implemented.");

                            case "core:resourceListArgument":
                                var ids = Jil.JSON.Deserialize <IEnumerable <long> >(kv.Value);
                                parameterValues.Add(kv.Name, Factory.EntityRepository.Get <MDL.IEntity>(ids));
                                break;

                            case "core:resourceArgument":
                                parameterValues.Add(kv.Name, GetId(kv.Value).Entity);
                                break;

                            default:
                                DatabaseType dbType = DatabaseType.ConvertFromDisplayName(argType.InternalDisplayName);
                                parameterValues.Add(kv.Name, dbType.ConvertFromString(kv.Value));
                                break;
                            }
                        }
                    }
                }

                var taskId = WorkflowRunner.Instance.RunWorkflowAsync(new WorkflowStartEvent(workflow)
                {
                    Arguments = parameterValues, Trace = trace
                });

                return(new HttpResponseMessage <string>(taskId));
            }
        }