Aspire + CosmosDB 模拟器 - 无法建立 SSL 连接

问题描述 投票:0回答:1

在默认示例 Aspire 项目中,我在 AppHost 中添加了 CosmosDB 托管包

Aspire.Hosting.Azure.CosmosDB
,并在 ApiService 中添加了 CosmosDB 组件
Aspire.Microsoft.Azure.Cosmos
。然后,我添加了逻辑,将一些数据播种到 CosmosDB 中,并在点击 /weatherforecast api 时读回它。

如果我在启动后过早点击Weather页面,我通常会遇到以下异常:

System.Net.Http.HttpRequestException:无法建立 SSL 连接,请参阅内部异常。 ---> System.IO.IOException: 从传输流接收到意外的 EOF 或 0 字节。

注意! 这导致了一个巨大的兔子洞,因为在 docker 容器中运行 CosmosDB 模拟器会出现“问题”,但基本上,Aspire Hosting 和 Component 很好地以正确的方式修复了容器和连接字符串,使其实际工作。无需回顾这些旧的黑客。

应用程序主机

var cosmosDb = builder.AddAzureCosmosDB("cosmos") .RunAsEmulator();

API服务

builder.AddAzureCosmosClient("cosmos");

我通过在 
app.Run()

之前调用以下方法来避免 apiservice 中的异常。

    internal static class CosmosExtensions
    {
        private class CosmosDB { }
        internal static async Task CreateDatabaseAndContainer(this WebApplication app)
        {
            var logger = app.Services.GetRequiredService<ILogger<CosmosDB>>();
            logger.LogInformation("Creating CosmosDB database and container");
            var client = app.Services.GetRequiredService<CosmosClient>();
            while (true)
            {
                try
                {
                    await client.ReadAccountAsync();
                    break;
                }
                catch (HttpRequestException ex) when (ex.HttpRequestError is HttpRequestError.SecureConnectionError)
                {
                    /* The CosmosDB emulator seems to take a very long time to start up, and returns this exception.
                     * System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
                    ---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
                     */
                    logger.LogWarning("CosmosDB connection retry");
                    Telemetry.CosmosDBConnectionRetries.Add(1);
                    await Task.Delay(1000);
                }
            }
            logger.LogInformation("CosmosDB connection success");
            
            Database database = await client.CreateDatabaseIfNotExistsAsync("Weather");
            Container container = await database.CreateContainerIfNotExistsAsync("Cities", "/city", 400);
            
            logger.LogInformation("CosmosDB container created");
        }
    }

但这感觉像是一次可怕的黑客攻击。我想知道我可能会错过什么?

azure-cosmosdb dotnet-aspire
1个回答
0
投票

查看

https://github.com/dotnet/aspire-samples/pull/321

中采用的方法。

© www.soinside.com 2019 - 2024. All rights reserved.