Elsa Web 工作流
安装指南:在 ASP.NET 应用中集成 Elsa 工作流
本指南将展示如何将 Elsa
工作流集成到 ASP.NET Core
应用程序中。这种设置非常适合于在后台执行长时间运行的工作流,支持诸如计时器(Timer
)、Cron
表达式、事件(Event
)等需要后台服务的各种活动。
初始设置
使用以下命令创建一个新的空 ASP.NET
应用:
dotnet new web -n "ElsaWeb" -f net8.0
导航至项目根目录并安装 Elsa
包:
cd ElsaWeb
dotnet add package Elsa
打开 Program.cs
文件,并替换其内容为:
Program.cs:
using Elsa.Extensions;
var builder = WebApplication.CreateBuilder(args);
// 将服务添加到容器中。
builder.Services.AddControllers();
builder.Services.AddElsa();
var app = builder.Build();
// 配置HTTP请求管道。
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
此配置允许您的应用程序使用 Elsa
服务来运行工作流。
尝试实践
示例 1:控制台输出
添加一个名为 RunWorkflowController
的新控制器:
Controllers/RunWorkflowController.cs:
using Elsa.Workflows.Activities;
using Elsa.Workflows.Contracts;
using Microsoft.AspNetCore.Mvc;
namespace ElsaWeb.Controllers;
[ApiController]
[Route("run-workflow")]
public class RunWorkflowController(IWorkflowRunner workflowRunner) : ControllerBase
{
[HttpGet]
public async Task<IActionResult> Get()
{
await workflowRunner.RunAsync(new WriteLine("你好,ASP.NET 世界!"));
return Ok();
}
}
使用以下命令启动应用:
dotnet run --urls=https://localhost:5001
然后访问 https://localhost:5001/run-workflow。控制台应显示 "你好,ASP.NET 世界!"
示例 2:HTTP 响应
安装 Elsa.Http
包:
dotnet add package Elsa.Http
在 Program.cs
中修改 Elsa 的设置:
builder.Services.AddElsa(elsa => elsa.UseHttp());
调整控制器以使用 WriteHttpResponse
活动:
Controllers/RunWorkflowController.cs:
using Elsa.Http;
using Elsa.Workflows.Contracts;
using Microsoft.AspNetCore.Mvc;
namespace ElsaWeb.Controllers;
[ApiController]
[Route("run-workflow")]
public class RunWorkflowController(IWorkflowRunner workflowRunner) : ControllerBase
{
[HttpGet]
public async Task Get()
{
await workflowRunner.RunAsync(new WriteHttpResponse
{
Content = new("你好,ASP.NET 世界的 HTTP!")
});
}
}
重启应用并导航至 https://localhost:5001/run-workflow。浏览器现在应该显示消息。
示例 3:工作流作为 HTTP 端点
除了编程式调用工作流之外,您还可以创建本身可通过 HTTP 路由的工作流。为此,我们需要向请求管道中添加 WorkflowsMiddleware
ASP.NET
中间件组件。
在 Program.cs
中,在 app.Run();
前添加以下行:
app.UseWorkflows();
创建一个具有 HTTP 功能的新工作流类:
Workflows/HttpHelloWorld.cs:
using Elsa.Http;
using Elsa.Workflows;
using Elsa.Workflows.Activities;
using Elsa.Workflows.Contracts;
namespace ElsaWeb.Workflows;
public class HttpHelloWorld : WorkflowBase
{
protected override void Build(IWorkflowBuilder builder)
{
builder.Root = new Sequence
{
Activities =
{
new HttpEndpoint
{
Path = new("/hello-world"),
CanStartWorkflow = true
},
new WriteHttpResponse
{
Content = new("HTTP工作流的世界,你好!")
}
}
};
}
}
工作流触发器
为了能让工作流运行时自动触发工作流,你需要将活动的 CanStartWorkflow
属性设置为 true
。这很容易被遗忘,所以当你在疑惑为什么一个工作流没有运行,即使你确定已经触发了它时,首先要检查的就是这个属性是否设置正确了。
更新 Program.cs
以注册此工作流:
using ElsaWeb.Workflows; // 添加这一行
builder.Services.AddElsa(elsa =>
{
elsa.AddWorkflow<HttpHelloWorld>();
elsa.UseHttp();
});
重启应用并访问 https://localhost:5001/workflows/hello-world。你应该能看到相应的消息。
HTTP 端点前缀路径
注意 URL 路径是/workflows/hello-world
而不是我们在工作流定义中定义的/hello-world
。这是因为WorkflowsMiddleware
组件默认配置使用/workflows
作为前缀路径。你可以通过向UseHttp
方法传递不同的前缀路径来更改这一点。例如,如果你想使用/api
,可以通过调用elsa.UseHttp(http => http.ConfigureHttpOptions = options => options.BasePath = "/api");
来实现。
总结
我们已经介绍了如何在 ASP.NET Core
应用程序中设置 Elsa Workflows
,展示了各种工作流执行和集成的方法。这种方法允许在你的 ASP.NET
应用中灵活高效地处理后台进程和活动。
完整的代码和额外资源可在此获取:这里。