Поставщик Cosmos DB в Entity Framework Core выбрасывает 400 BadRequest - PullRequest
0 голосов
/ 08 декабря 2018

Я интегрировал Cosmos DB в свой проект ASP.NET Core API, используя последний пакет EF Core, поставляемый с поставщиком Cosmos DB.

Я могу успешно использовать этого поставщика при локальном запускев моем локальном кластере ASF, подключаясь к локальному экземпляру эмулятора Cosmos DB.Однако при попытке выполнить локальный ASF или ASF, размещенный в Azure, я не могу подключиться к экземпляру Azure Cosmos DB.По какой-то причине я продолжаю получать 400 BadRequest при инициализации начального числа для базы данных / коллекции.

Это следующая строка, которая генерирует ошибку:

var created = await context.Database.EnsureCreatedAsync();

Исключение:

BadRequest в Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosClient.CreateDocumentCollectionIfNotExistsOnceAsync (DbContext _, String collectionId, CancellationToken cancellationToken)4 operation, Func 4 verifySucceeded, состояние TS, состояние CancellationToken cancellationToken)
в Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync [TState, TResult] (Func 4 operation, Func 4 verifySucceeded, состояние TState, CancellationToreCore на уровне отмены..Storage.Internal.CosmosDatabaseCreator.EnsureCreatedAsync (CancellationToken cancellationToken) в Infrastructure.SystemDataContextSeed.SeedAsync (SystemDataContext context) в Infrastructure \ SystemDataContextSeed.cs: строка 21 в xtensions.IWebHostExtensions.Seed (веб-хост IWebHost) в Extensions \ IWebHostExtensions.cs: строка 23 в Api.строка 47 в Microsoft.ServiceFabric.Services.Communication.AspNetCore.AspNetCoreCommunicationListener.OpenAsync (CancellationToken cancellationToken) в Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter * * OpenCommunicationLink 1015:

  • Анализирует аналитику журналов, показывает отсутствие регистрации для этих запросов
  • Удаление 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;
        }

Любые идеи приветствуются!

1 Ответ

0 голосов
/ 24 декабря 2018

Для справки, поставщик Cosmos DB в EF Core 2.2 является предварительным просмотром и не подходит для использования с базой данных Cosmos DB, размещенной в Azure.Это связано с тем, что в некоторых местах отсутствуют заголовки, которые, по-видимому, не являются проблемой для эмулятора, но приводят к 400 при выполнении exe для Azure.

Проблема, на которую я смотрел больше всего, заключалась в том, что я получил400, когда он пытался создать коллекцию документов.Покопавшись в исходном коде EF Core, я увидел, что он не отправлял ключи разделов.На самом деле в текущей реализации Cosmos DB реализации ключей разделения вообще нет.И поскольку я создал базу данных в Azure с общей пропускной способностью для всех коллекций, вам, очевидно, необходимо предоставить ключ раздела на уровне коллекции.

...