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

.NET 6无Program/Startup类的Azure Function如何启动时仅连一次Cosmos DB?

在.NET 6 Azure Functions(无Program/Startup)中复用Cosmos DB连接

对于你的场景,.NET 6的Azure Functions(in-process模型)支持通过FunctionsStartup实现依赖注入,以此注册单例的CosmosClient,让所有端点复用同一个连接实例,具体步骤如下:

1. 创建Startup类并注册CosmosClient单例

新建Startup.cs文件,用[assembly: FunctionsStartup]标记,Azure Functions会自动识别并加载这个类的配置:

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Azure.Cosmos;

[assembly: FunctionsStartup(typeof(YourFunctionApp.Startup))]
namespace YourFunctionApp
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            // 从配置中读取Cosmos DB连接字符串和数据库名称
            var cosmosConnectionString = builder.GetContext().Configuration["CosmosDb:ConnectionString"];
            var databaseName = builder.GetContext().Configuration["CosmosDb:DatabaseName"];

            // 注册单例CosmosClient - CosmosClient本身线程安全,全局复用能避免重复建连开销
            builder.Services.AddSingleton<CosmosClient>(sp => 
                new CosmosClient(cosmosConnectionString));
            
            // 可选:如果多个函数复用同一数据库,可直接注册Database单例
            builder.Services.AddSingleton(sp => 
                sp.GetRequiredService<CosmosClient>().GetDatabase(databaseName));
        }
    }
}

2. 在函数类中通过构造函数注入使用

在你的GET/POST/PUT等函数类里,通过构造函数注入CosmosClient或Database,无需每次请求新建对象:

示例:GET函数类

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.Cosmos;
using System.Threading.Tasks;

namespace YourFunctionApp
{
    public class GetItemsFunction
    {
        private readonly Database _cosmosDatabase;

        // 构造函数注入已初始化的Database实例
        public GetItemsFunction(Database cosmosDatabase)
        {
            _cosmosDatabase = cosmosDatabase;
        }

        [Function("GetItems")]
        public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req)
        {
            // 复用Database实例获取容器
            var container = _cosmosDatabase.GetContainer("YourContainerName");
            
            // 执行查询操作
            var query = container.GetItemQueryIterator<YourItem>("SELECT * FROM c");
            var results = await query.ReadNextAsync();
            
            // 构建响应
            var response = req.CreateResponse(System.Net.HttpStatusCode.OK);
            await response.WriteAsJsonAsync(results);
            return response;
        }
    }
}

关键注意事项

  • CosmosClient的设计特性:CosmosClient是线程安全的重量级对象,创建时会建立连接池,复用它能显著减少连接开销、提升性能。
  • 配置项设置:确保local.settings.json(本地开发)或Azure函数配置中包含以下项:
    {
        "Values": {
            "CosmosDb:ConnectionString": "你的Cosmos DB连接字符串",
            "CosmosDb:DatabaseName": "目标数据库名称"
        }
    }
    
  • 若你使用的是isolated进程模型(从你的描述看大概率是in-process),则需要创建Program.cs配置DI,但in-process模型更适配你当前无Program/Startup的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:42:24