【发布时间】:2018-12-08 13:17:43
【问题描述】:
我已使用 Cosmos DB 提供程序附带的最新 EF Core 包将 Cosmos DB 集成到我的 ASP.NET Core API 项目中。
当我在本地 ASF 集群中本地运行时,我能够成功使用此提供程序,连接到本地 Cosmos DB 模拟器实例。但是,当尝试在本地 ASF 或 Azure 托管的 ASF 中运行时,我无法连接到 Azure Cosmos DB 实例。出于某种原因,在初始化数据库/集合的种子时,我不断收到 400 BadRequest。
产生错误的是以下行:
var created = await context.Database.EnsureCreatedAsync();
例外:
错误请求 在 Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosClient.CreateDocumentCollectionIfNotExistsOnceAsync(DbContext _, String collectionId, CancellationToken cancelToken)
在 Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func4 operation, Func4 verifySucceeded, TState state, CancellationToken cancelToken)
在 Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func4 operation, Func4 verifySucceeded, TState state, CancellationToken cancelToken) 在 Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosDatabaseCreator.EnsureCreatedAsync(CancellationToken cancelToken) 在 Infrastructure.SystemDataContextSeed.SeedAsync(SystemDataContext context) 在 Infrastructure\SystemDataContextSeed.cs:line 21 在 Extensions\IWebHostExtensions.cs:line 23 中的 xtensions.IWebHostExtensions.Seed(IWebHost webhost) 在 Api.c__DisplayClass1_0.b__1(String url, AspNetCoreCommunicationListener listener) 在 AccountApi.cs:line 47 在 Microsoft.ServiceFabric.Services.Communication.AspNetCore.AspNetCoreCommunicationListener.OpenAsync(CancellationToken cancelToken) 在 Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.OpenCommunicationListenersAsync(CancellationToken cancelToken)
我尝试过的:
- 分析日志分析,显示这些请求没有日志记录
- 删除 EnsureCreated 并直接插入数据
- 手动创建集合 (SystemDataContext)
- 手动创建数据库 (AccountService)
- 在 azure 中删除网络防火墙(允许所有网络)
使用的端点详细信息采用以下形式:
"Cosmos": {
"EndPoint": "https://xxxx-sqlapi.documents.azure.com:443",
"AuthKey": "xxx==",
"DatabaseName": "AccountService"
},
连接 Cosmos DB 提供程序的扩展方法:
public static IServiceCollection AddCosmosSettings(this IServiceCollection services, IConfiguration configuration)
{
services.AddEntityFrameworkCosmos()
.AddDbContext<SystemDataContext>(options =>
{
options.UseCosmos(configuration["Cosmos:EndPoint"], configuration["Cosmos:AuthKey"], configuration["Cosmos:DatabaseName"]); ;
},
ServiceLifetime.Scoped //Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request)
);
return services;
}
非常感谢任何想法!
【问题讨论】:
-
您只发布了异常的 stacktrace - 但没有发布实际异常及其异常消息和可能的内部异常。请也发布此重要信息!
-
其实就是,消息只是'BadRequest',仅此而已……而且没有内部异常,如果不清楚,请见谅!
-
您必须缺少一些额外的错误数据。 BadRequest 非常笼统,通常带有解释。
-
我希望...我已经研究了一段时间,但是这里的 Stacktrace 就是全部...我想知道它是否与集合名称有关,在挖掘之后在存储库中。我根本没有指定它,但它适用于 localhost...
-
作为参考,我在github.com/aspnet/EntityFrameworkCore/issues/14123 创建了一个问题,显然对 Azure 托管的 cosmos db 实例没有任何请求。缺少标题会阻止它成功创建集合、文档、...
标签: c# entity-framework-core azure-cosmosdb azure-cosmosdb-sqlapi