如何将 Cosmos DB 添加到 .Net 6 Web API?

Posted

技术标签:

【中文标题】如何将 Cosmos DB 添加到 .Net 6 Web API?【英文标题】:How to add CosmosDB to .Net 6 WebAPI? 【发布时间】:2021-12-20 15:02:52 【问题描述】:

我想在 .Net 6 WebAPI 中使用 CosmosDB SQL-API。是否还有 AddCosmos() 方法可用于在不同的服务中注入客户端,或者是否真的有必要使用接口实现我自己的 cosmos-service 以将客户端注入我自己的服务类?

【问题讨论】:

据我所知,只有 EF Core 有这样的方法来连接。无论如何,我最终得到了自己的包装器(用于诊断日志记录)。由于 EF Core 有一些 CosmosDB 支持——对 CosmosDB 的使用方式有相当严格的限制——添加 EF Core 可以让你进入 CosmosDB... 我的回答对你有用吗? 【参考方案1】:

在 .Net 6.0 中,您应该在 `Program.cs` 文件中添加 `CosmosClient`,如下例代码所示。

using Microsoft.Azure.Cosmos;
using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
builder.Services.AddSwaggerGen(c =>

    c.SwaggerDoc("v1", new()  Title = "WebApplication1", Version = "v1" );
); 
builder.Services.AddHttpClient();
builder.Services.AddSingleton<CosmosClient>(serviceProvider =>

    //IHttpClientFactory httpClientFactory = serviceProvider.GetRequiredService<IHttpClientFactory>();

    //CosmosClientOptions cosmosClientOptions = new CosmosClientOptions
    //
        //HttpClientFactory = httpClientFactory.CreateClient,
        //ConnectionMode = ConnectionMode.Gateway
    //;

    return new CosmosClient("<cosmosdb_connectionstring>");
    // sample code
    //return new CosmosClient("AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==");//, cosmosClientOptions);
);

var app = builder.Build();

// Configure the HTTP request pipeline.
if (builder.Environment.IsDevelopment())

    app.UseDeveloperExceptionPage();
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication1 v1"));


app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

然后您可以将CosmosClient 注入您的控制器。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Cosmos;
using Microsoft.WindowsAzure.Storage.Table;

namespace WebApplication1.Controllers;
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase

    public CosmosClient _client;
    private readonly ILogger<WeatherForecastController> _logger;

    public HomeController(ILogger<WeatherForecastController> logger, CosmosClient client)
    
        _logger = logger;
        _client = client;
    
    [HttpGet]
    public async Task<string> getvalue() 
        string dbname = "test";
        string containername = "container1";
        Database database = await _client.CreateDatabaseIfNotExistsAsync(dbname);
        Container container = database.GetContainer(containername);
        var query = container.GetItemQueryIterator<Test>("SELECT c.id FROM c");
        string ss = string.Empty;
        while (query.HasMoreResults)
        
            FeedResponse<Test> result = await query.ReadNextAsync();
            foreach (var item in result) 
                ss += item.id;
            
        
        return ss;
    
    public class Test : TableEntity  
        public int id  get; set; 
    


测试结果

我的 cosmosdb 中的值。

通过 api 获取值

【讨论】:

您的示例中没有使用 HttpClientFactory 和 CosmosClientOptions,也不需要 @MatiasQuaranta 我评论了HttpClientFactory CosmosClientOptions ,只是一个示例代码,op 可以参考。谢谢你的建议。【参考方案2】:

这就是我所做的。

程序.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

//Start adding Congiguration for cosmos db
static async Task<CosmosDbService> InitializeCosmosClientInstanceAsync(IConfigurationSection configurationSection)

    var databaseName = configurationSection["DatabaseName"];
    var containerName = configurationSection["ContainerName"];
    var account = configurationSection["Account"];
    var key = configurationSection["Key"];
    var client = new Microsoft.Azure.Cosmos.CosmosClient(account, key);
    var database = await client.CreateDatabaseIfNotExistsAsync(databaseName);
    await database.Database.CreateContainerIfNotExistsAsync(containerName, "/id");
    var cosmosDbService = new CosmosDbService(client, databaseName, containerName);
    return cosmosDbService;


var section = builder.Configuration.GetSection("CosmosDb");
builder.Services.AddSingleton<ICosmosDbService>(
    InitializeCosmosClientInstanceAsync(section).GetAwaiter().GetResult());

//end

【讨论】:

以上是关于如何将 Cosmos DB 添加到 .Net 6 Web API?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Azure 虚拟网络从 power bi 桌面应用程序连接到 cosmos db

使用 .NET 在 Angular 和 Cosmos DB 之间传递“纯”(无类)json

如何创建通用 cosmos db terraform 模块以添加多个地理位置

Azure 函数:如何将 http 触发器函数的查询字符串参数绑定到 Cosmos DB 的 SQL 查询

Azure Cosmos DB:将集合克隆到另一个数据库

如何在 C# 中从 cosmos db 获取准确的最新 5 分钟数据