在默认示例 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();
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");
}
}
但这感觉像是一次可怕的黑客攻击。我想知道我可能会错过什么?