我有一个可以读取和写入 CosmosDb 的 Blazor 应用程序。尝试添加一些新功能,这些功能在本地运行良好,但在部署到 Azure 后就崩溃了。我已将问题追溯到我的CosmosDbService
. 我想添加ILogger
并CosmosDbService
进一步追踪我的问题。但是,在测试 DI 时,我的代码停在CreateDatabaseIfNotExistsAsync(databasename)
. 之前的代码没有错误。没有例外,没有超时,没有什么只是无声的失败。Azure 没有报告任何内容。如果我将所有内容都回滚到原始状态,它就会起作用。显然它在某个地方,但我没有看到它。所以我的问题是 1)为什么我的应用程序现在停止/挂起?2) 我是否将 ILogger 正确注入到我的 CosmosDbService 中?这是相关的代码。
Startup.cs
....
services.AddSingleton<ICosmosDbService>((s) =>
{
var logger = s.GetRequiredService<ILogger<CosmosDbService>>();
return InitializeCosmosClientInstanceAsync(Configuration.GetSection("CosmosDb"), logger).GetAwaiter().GetResult();
});
'''
private static async Task<CosmosDbService> InitializeCosmosClientInstanceAsync(IConfigurationSection configurationSection, ILogger logger)
{
string databaseName = configurationSection.GetSection("DatabaseName").Value;
string containerRatings = configurationSection.GetSection("ContainerRatings").Value;
string containerUsers = configurationSection.GetSection("ContainerUsers").Value;
string containerLocations = configurationSection.GetSection("ContainerLocations").Value;
string account = configurationSection.GetSection("Account").Value;
string key = configurationSection.GetSection("Key").Value;
CosmosClientBuilder clientBuilder = new CosmosClientBuilder(account, key);
CosmosClient client = clientBuilder
.WithConnectionModeDirect()
.WithSerializerOptions(new CosmosSerializationOptions { PropertyNamingPolicy = CosmosPropertyNamingPolicy.Default })
.Build();
//CosmosDbService cosmosDbService = new CosmosDbService(client, databaseName, containerRatings, containerUsers, containerLocations);
CosmosDbService cosmosDbService = new CosmosDbService()
{
ContainerRatings = client.GetContainer(databaseName, containerRatings),
ContainerRateLocationSmall = client.GetContainer(databaseName, containerLocations),
ContainerRateUser = client.GetContainer(databaseName, containerUsers),
CosmosClient = client,
DatabaseName = databaseName
, _logger = logger
};
DatabaseResponse database = await client.CreateDatabaseIfNotExistsAsync(databaseName);
await database.Database.CreateContainerIfNotExistsAsync(containerRatings, "/What");
await database.Database.CreateContainerIfNotExistsAsync(containerUsers, "/UserName");
await database.Database.CreateContainerIfNotExistsAsync(containerLocations, "/id");
return cosmosDbService;
}
...
CosmosDBService.cs
...
public class CosmosDbService : ICosmosDbService
{
public CosmosClient CosmosClient { get; set; }
public string DatabaseName { get; set; }
public Container ContainerRatings { get; set; }
public Container ContainerRateUser { get; set; }
public Container ContainerRateLocationSmall { get; set; }
public ILogger _logger { get; set; }
//public CosmosDbService() { }
...
提前致谢。
--更新 2020-12-06 ---
谢谢广哥。您的问题和建议激发了新的思路。我要感谢你的答案。
- 我注意到新行
Startup.cs
导致服务在实际程序执行的后期延迟加载:
var logger = s.GetRequiredService<ILogger<CosmosDbService>>();
当我将此行恢复为其原始语法时,它在启动期间成功初始化。
services.AddSingleton<ICosmosDbService>(InitializeCosmosClientInstanceAsync(Configuration.GetSection("CosmosDb")).GetAwaiter().GetResult());
- 将 ILogger 注入到我的 CosmosDBService 中。在日志记录( https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-5.0 )上进行重新 RTFM似乎我需要改用工厂。所以我将实例化更改为:
LoggerFactory loggerFactory = new LoggerFactory();
//CosmosDbService cosmosDbService = new CosmosDbService(client, databaseName, containerR8ings, containerUsers, containerLocations);
CosmosDbService cosmosDbService = new CosmosDbService()
{
ContainerR8ings = dbClient.GetContainer(databaseName, containerR8ings),
ContainerR8User = dbClient.GetContainer(databaseName, containerUsers),
ContainerR8LocationSmall = dbClient.GetContainer(databaseName, containerLocations),
_logger = loggerFactory.CreateLogger("CosmosDbService")
};
并通过删除显式构造函数并使用隐式构造函数与 CosmosDBService 相对应。然后我能够将 Logger 添加到服务中。
- 最后,这使我能够跟踪我正在寻找的原始错误。
再次感谢您的帮助。