如何在Azure Durable Function中获取连接字符串
在Durable Functions中访问连接字符串
一、Activity函数与Http启动函数的访问方式
对于Activity函数(如你的SayHello)和Http启动函数(MyFunction_HttpStart),可通过FunctionContext获取IConfiguration实例来访问连接字符串,具体实现如下:
- 保留函数参数中的
FunctionContext - 通过
FunctionContext.GetService<IConfiguration>()获取配置实例 - 调用
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
相关产品推荐
相关产品推荐

