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

.NET 8独立进程下如何检查BuildingsOrchestration编排函数是否运行

.NET 8独立进程模式下检查Durable Orchestration运行状态的方法

原触发函数代码

[Function(nameof(FunctionNames.BuildingsStart))]
public static async Task<HttpResponseData> HttpRun(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] 
    HttpRequestData req,
    [DurableClient] DurableTaskClient client, 
    FunctionContext executionContext)
{
    ILogger logger = executionContext.GetLogger(nameof(HttpRun));

    string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(FunctionNames.BuildingsOrchestration));
    logger.LogInformation("Created new orchestration with instance ID = {instanceId}", instanceId);

    return client.CreateCheckStatusResponse(req, instanceId);
}

问题

在.NET 8独立进程(非进程内)模式下,如何检查BuildingsOrchestration编排函数是否已处于运行状态或正在执行过程中?

解决方案

在.NET 8独立进程模式下,依然可以通过DurableTaskClient提供的API查询编排实例状态,核心是获取实例的运行状态枚举值,判断是否属于运行中/执行过程的范畴。

具体实现步骤

  1. 在函数中注入DurableTaskClient(与原触发函数的注入方式一致)
  2. 调用GetInstanceAsync方法获取指定实例的状态信息
  3. 根据OrchestrationRuntimeStatus枚举值判断实例是否处于运行状态

示例代码

[Function(nameof(CheckBuildingOrchestrationStatus))]
public static async Task<HttpResponseData> CheckBuildingOrchestrationStatus(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req,
    [DurableClient] DurableTaskClient client,
    FunctionContext executionContext)
{
    var logger = executionContext.GetLogger(nameof(CheckBuildingOrchestrationStatus));
    
    // 从请求查询参数中获取要检查的实例ID
    if (!req.Query.TryGetValues("instanceId", out var instanceIdValues) || string.IsNullOrWhiteSpace(instanceIdValues.First()))
    {
        var badRequest = req.CreateResponse(HttpStatusCode.BadRequest);
        await badRequest.WriteStringAsync("请提供有效的instanceId查询参数");
        return badRequest;
    }
    
    string targetInstanceId = instanceIdValues.First();
    
    try
    {
        var instance = await client.GetInstanceAsync(targetInstanceId);
        
        // 判定运行中/执行过程中的状态:Running(正在运行)、Pending(等待执行)、ContinuedAsNew(重启执行)
        bool isInExecution = instance.Status is OrchestrationRuntimeStatus.Running 
            or OrchestrationRuntimeStatus.Pending 
            or OrchestrationRuntimeStatus.ContinuedAsNew;
        
        var response = req.CreateResponse(HttpStatusCode.OK);
        await response.WriteAsJsonAsync(new
        {
            InstanceId = targetInstanceId,
            CurrentStatus = instance.Status.ToString(),
            IsInExecution = isInExecution
        });
        return response;
    }
    catch (OrchestrationInstanceNotFoundException)
    {
        var notFoundResp = req.CreateResponse(HttpStatusCode.NotFound);
        await notFoundResp.WriteStringAsync($"实例ID {targetInstanceId} 不存在");
        return notFoundResp;
    }
}

关键说明

  • DurableTaskClient.GetInstanceAsync:用于获取指定ID的编排实例详情,包含状态信息
  • OrchestrationRuntimeStatus枚举:定义了编排实例的所有可能状态,其中Running、Pending、ContinuedAsNew属于执行过程中的状态
  • 异常处理:当实例ID不存在时会抛出OrchestrationInstanceNotFoundException,需要捕获并返回对应响应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:43:25