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

ELSA 3.0:使用IWorkflowRuntime调用已注册工作流报错排查

问题描述

我已按照相关文档创建并注册了工作流:

class DailyReport : WorkflowBase { ... }

services.AddElsa(elsa => elsa.AddWorkflow<DailyReport>());

使用IWorkflowRuntime启动时,抛出“Specified workflow definition and version does not exist”异常:

var runtime = serviceProvider.GetRequiredService<IWorkflowRuntime>();

var result = await runtime.StartWorkflowAsync("DailyReport");

但使用IWorkflowRunner运行该工作流却正常:

var runner = serviceProvider.GetRequiredService<IWorkflowRunner>();

var result = await runner.RunAsync(new DailyReport());

请问我遗漏了什么配置或步骤?


解决方案

问题核心是IWorkflowRuntime和IWorkflowRunner的运行逻辑差异:

  • IWorkflowRunner直接运行内存中的工作流实例,不需要依赖持久化存储,所以直接实例化DailyReport就能正常执行。
  • IWorkflowRuntime则依赖已持久化到存储中的工作流定义启动实例,必须先把工作流定义写入数据库(或其他存储介质),才能通过名称/ID找到并启动。

你需要补充以下配置步骤:

  1. 启用工作流定义持久化
    在注册Elsa服务时,添加存储配置(以EF Core为例):

    services.AddElsa(elsa => elsa
        .AddWorkflow<DailyReport>()
        .AddEntityFrameworkStores<SqliteContext>() // 替换为你的项目数据库上下文
        .AddWorkflowDefinitionProvider<StoredWorkflowDefinitionProvider>()
    );
    
  2. 将工作流定义同步到存储
    应用启动时,需要把注册的工作流导入到存储中。可以通过IWorkflowDefinitionImporter手动执行:

    using var scope = serviceProvider.CreateScope();
    var importer = scope.ServiceProvider.GetRequiredService<IWorkflowDefinitionImporter>();
    await importer.ImportAsync<DailyReport>();
    

    或者在注册时开启自动发布(Elsa 3.x支持):

    services.AddElsa(elsa => elsa
        .AddWorkflow<DailyReport>(options => options.Publish = true)
        // 其他配置项...
    );
    
  3. 确保启动标识匹配
    StartWorkflowAsync的参数需要对应工作流定义的名称或ID。建议在工作流类上显式指定名称,避免自动生成的名称不匹配:

    [Workflow(Name = "DailyReport")]
    class DailyReport : WorkflowBase { ... }
    

总结:IWorkflowRuntime依赖持久化的工作流定义,配置好存储并完成定义导入后,就能正常用它启动工作流了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:07:17