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

如何在Azure Durable Function中获取连接字符串

在Durable Functions中访问连接字符串

一、Activity函数与Http启动函数的访问方式

对于Activity函数(如你的SayHello)和Http启动函数(MyFunction_HttpStart),可通过FunctionContext获取IConfiguration实例来访问连接字符串,具体实现如下:

  1. 保留函数参数中的FunctionContext
  2. 通过FunctionContext.GetService<IConfiguration>()获取配置实例
  3. 调用GetConnectionString方法获取目标连接字符串

修改后的SayHello函数示例:

[Function(nameof(SayHello))]
public static string SayHello([ActivityTrigger] string name, FunctionContext executionContext)
{
    ILogger logger = executionContext.GetLogger("SayHello");
    // 获取IConfiguration实例
    var configuration = executionContext.GetService<IConfiguration>();
    // 读取连接字符串
    var connectionString = configuration.GetConnectionString("MyConnectionString");
    
    logger.LogInformation("向{name}打招呼,已加载连接字符串", name);
    return $"Hello {name}!";
}

Http启动函数的修改示例:

[Function("MyFunction_HttpStart")]
public static async Task<HttpResponseData> HttpStart(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
    [DurableClient] DurableTaskClient client,
    FunctionContext executionContext)
{
    ILogger logger = executionContext.GetLogger("MyFunction_HttpStart");
    // 获取IConfiguration实例
    var configuration = executionContext.GetService<IConfiguration>();
    var connectionString = configuration.GetConnectionString("MyConnectionString");
    
    string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(MyFunction));
    logger.LogInformation("已启动编排实例,ID为'{instanceId}'", instanceId);
    
    return await client.CreateCheckStatusResponseAsync(req, instanceId);
}

二、Orchestrator函数的注意事项

Orchestrator函数(如RunOrchestrator)不能直接访问IConfiguration,因为Orchestrator需要保证可重入性,直接访问外部依赖会破坏重放逻辑。如果需要在Orchestrator中使用连接字符串相关逻辑,建议采用以下两种方式:

方式1:从上游函数传递参数

在Http启动函数或Activity函数中先获取连接字符串,再将需要的参数传递给Orchestrator:

// 修改Http启动函数,传递连接字符串作为输入
[Function("MyFunction_HttpStart")]
public static async Task<HttpResponseData> HttpStart(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
    [DurableClient] DurableTaskClient client,
    FunctionContext executionContext)
{
    var configuration = executionContext.GetService<IConfiguration>();
    var connectionString = configuration.GetConnectionString("MyConnectionString");
    
    // 将连接字符串作为输入参数传递给Orchestrator
    string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(
        nameof(MyFunction), 
        input: connectionString);
    
    return await client.CreateCheckStatusResponseAsync(req, instanceId);
}

// 修改Orchestrator函数,接收传递的参数
[Function(nameof(MyFunction))]
public static async Task<List<string>> RunOrchestrator(
    [OrchestrationTrigger] TaskOrchestrationContext context)
{
    ILogger logger = context.CreateReplaySafeLogger(nameof(MyFunction));
    // 获取传递过来的连接字符串
    string connectionString = context.GetInput<string>();
    
    logger.LogInformation("已接收连接字符串");
    var outputs = new List<string>();
    
    outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "Tokyo"));
    // 也可将连接字符串传递给Activity使用
    outputs.Add(await context.CallActivityAsync<string>(nameof(SayHelloWithConn), new { Name = "Seattle", ConnStr = connectionString }));
    
    return outputs;
}

// 新增接收连接字符串的Activity函数
[Function(nameof(SayHelloWithConn))]
public static string SayHelloWithConn([ActivityTrigger] dynamic input, FunctionContext executionContext)
{
    ILogger logger = executionContext.GetLogger("SayHelloWithConn");
    logger.LogInformation("向{name}打招呼,已使用传入的连接字符串", input.Name);
    return $"Hello {input.Name}! 已加载连接字符串";
}

方式2:将依赖配置的逻辑放在Activity中执行

Orchestrator仅负责调度Activity,所有需要访问连接字符串的业务逻辑都在Activity函数中完成,避免Orchestrator直接接触外部依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:52:04