You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在控制器中基于Workflow模型启动Elsa工作流并获取实例ID

Elsa Workflow 启动实例与输入设置解决方案

一、需要注入的核心服务

在API控制器中,需注入以下Elsa核心服务来完成工作流实例创建、启动及输入管理:

  • IWorkflowRuntime:负责启动工作流实例并返回实例信息
  • IWorkflowRegistry:用于查询管理员已发布的工作流定义
  • IWorkflowInstanceStore:(可选)用于持久化或更新工作流实例的输入/状态

二、正确启动工作流实例并获取实例ID

你可以优化代码逻辑,直接通过工作流名称查找定义并启动实例,高效获取实例ID:

using Elsa.Models;
using Elsa.Services;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/entities")]
public class EntityWorkflowController : ControllerBase
{
    private readonly IWorkflowRuntime _workflowRuntime;
    private readonly IWorkflowRegistry _workflowRegistry;

    // 构造函数注入所需服务
    public EntityWorkflowController(IWorkflowRuntime workflowRuntime, IWorkflowRegistry workflowRegistry)
    {
        _workflowRuntime = workflowRuntime;
        _workflowRegistry = workflowRegistry;
    }

    [HttpPost("{entityId}/start-flow")]
    public async Task<IActionResult> StartFlowOfSomeEntity(int entityId)
    {
        // 1. 根据工作流名称查找最新版本的已发布定义
        var workflowDefinition = await _workflowRegistry.FindByNameAsync(
            "MyFlowName", 
            VersionOptions.Latest, 
            CancellationToken.None);
        
        if (workflowDefinition == null)
            return NotFound("指定的工作流定义不存在");

        // 2. 准备关联实体的业务输入参数
        var input = new Dictionary<string, object>
        {
            ["EntityId"] = entityId,
            // 可添加其他业务参数,如审批人、实体类型等
        };

        // 3. 启动工作流并获取实例ID
        var workflowInstance = await _workflowRuntime.StartWorkflowAsync(
            workflowDefinitionId: workflowDefinition.Id,
            input: input,
            cancellationToken: CancellationToken.None);

        return Ok(new { WorkflowInstanceId = workflowInstance.Id });
    }
}

三、设置工作流输入的正确方式

你之前使用WorkflowStorageService.UpdateInputAsync的方式不符合Elsa的最佳实践,正确的输入设置分为两种场景:

  1. 启动时传入输入:如上述代码所示,在StartWorkflowAsync中直接通过input参数传递,工作流启动即可直接使用这些参数,这是最推荐的方式。
  2. 运行中更新输入:若需在实例启动后修改输入,使用IWorkflowInstanceStore持久化更新,示例如下:
private readonly IWorkflowInstanceStore _workflowInstanceStore;

// 构造函数补充注入IWorkflowInstanceStore
public EntityWorkflowController(IWorkflowRuntime workflowRuntime, IWorkflowRegistry workflowRegistry, IWorkflowInstanceStore workflowInstanceStore)
{
    _workflowRuntime = workflowRuntime;
    _workflowRegistry = workflowRegistry;
    _workflowInstanceStore = workflowInstanceStore;
}

[HttpPatch("{workflowInstanceId}/update-input")]
public async Task<IActionResult> UpdateWorkflowInput(string workflowInstanceId, int newEntityId)
{
    // 查找目标工作流实例
    var workflowInstance = await _workflowInstanceStore.FindByIdAsync(workflowInstanceId, CancellationToken.None);
    
    if (workflowInstance == null)
        return NotFound("工作流实例不存在");

    // 更新输入参数
    workflowInstance.Input["EntityId"] = newEntityId;
    
    // 持久化更新
    await _workflowInstanceStore.SaveAsync(workflowInstance, CancellationToken.None);

    return Ok("输入参数已更新");
}

四、关键注意事项

  • 确保工作流定义处于已发布状态,否则IWorkflowRegistry无法查询到有效定义。
  • 工作流名称MyFlowName需与管理员创建的模型名称完全一致,注意大小写和拼写。
  • 若需跟踪实例状态,可通过IWorkflowInstanceStore查询实例的Status属性(如Running、Completed、Faulted等)。

内容的提问来源于stack exchange,提问作者Doma NZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:20:33