System.Net.WebException: удаленный сервер возвратил ошибку: (429) Too Many Requests
Я работаю над проектом разработки API с использованием ASP.NET Core 2.2, GraphQL.NET, CosmosDB, EntityFrameworkCore (Microsoft.EntityFrameworkCore.Cosmos(2.2.4).
При запуске решения я вижу ошибку в окне вывода VS2019:
System.Net.WebException: The remote server returned an error: (429) Too Many Requests.
at System.Net.HttpWebRequest.GetResponse()
at Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosClient.CreateDocumentCollectionIfNotExistsOnce(DbContext _, String collectionId)
at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementation[TState,TResult](Func`3 operation, Func`3 verifySucceeded, TState state)
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 119926.3431ms 200 application/json
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 POST http://localhost:53116/graphql application/json 1468
Microsoft.EntityFrameworkCore.Infrastructure:Information: Entity Framework Core 2.2.4-servicing-10062 initialized 'TaxathandDbContext' using provider 'Microsoft.EntityFrameworkCore.Cosmos' with options: ServiceEndPoint=https://taxathanddb.documents.azure.com/ Database=TaxathandDb
Microsoft.EntityFrameworkCore.Infrastructure:Information: A transient exception has been encountered during execution and the operation will be retried after 9031ms.
System.Net.WebException: The remote server returned an error: (429) Too Many Requests.
at System.Net.HttpWebRequest.GetResponse()
at Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosClient.CreateDocumentCollectionIfNotExistsOnce(DbContext _, String collectionId)
at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementation[TState,TResult](Func`3 operation, Func`3 verifySucceeded, TState state)
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
string serviceEndPoint = Configuration.GetValue<string>("CosmosDBEndpoint");
string authKeyOrResourceToken = Configuration.GetValue<string>("CosmosDBAccessKey");
string databaseName = Configuration.GetValue<string>("CosmosDBName");
services.AddEntityFrameworkCosmos();
services.AddScoped<DbContext, SampleDbContext>();
services.AddDbContext<TaxathandDbContext>(options => options.UseCosmos(serviceEndPoint, authKeyOrResourceToken, databaseName, contextOptions =>
{
contextOptions.ExecutionStrategy(d => new CosmosExecutionStrategy(d));
}
));
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IDocumentExecuter, DocumentExecuter>();
services.AddSingleton<IDataLoaderContextAccessor, DataLoaderContextAccessor>();
services.AddSingleton<DataLoaderDocumentListener>();
services.AddSingleton<IDocumentWriter, DocumentWriter>();
services.AddScoped<IUtilityService, UtilityService>();
services.AddScoped<ICommonService, CommonService>();
services.AddScoped<ICountryService, CountryService>();
services.AddScoped<CountryResultType>();
services.AddScoped<GraphQLQuery>();
services.AddScoped<ICountriesResolver, CountriesResolver>();
services.AddScoped<CountryType>();
services.AddScoped<Response>();
services.AddScoped(typeof(ResponseGraphType<>));
services.AddScoped(typeof(ResponseListGraphType<>));
services.AddTransient<IAddressRepository, AddressRepository>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
services.AddGraphQL(o =>
{
o.ExposeExceptions = true;
}
).AddGraphTypes(ServiceLifetime.Scoped);
services.AddScoped<IDependencyResolver>(s => new FuncDependencyResolver(s.GetRequiredService));
services.AddScoped<SampleSchema>();
}
Может ли кто-нибудь помочь мне решить эту проблему?
2 ответа
Я хотел бы узнать больше о файле контекста, так как в ошибке указано слишком много запросов. Поэтому, учитывая, что вы уже развернули базу данных в cosmosdb, рекомендуется удалить Database.EnsureCreated(), так как она будет пытаться проверять базу данных и создавать модели по каждому запросу, что не рекомендуется и создаст проблемы с производительностью.
Обратитесь к этой документации для получения дополнительной информации https://docs.microsoft.com/en-us/ef/core/providers/cosmos/?tabs=dotnet-core-cli
Учитывая, что у вас нет промежуточного программного обеспечения для динамического ограничения трафика, и учитывая, что трассировка стека в значительной степени относится к Cosmos, держу пари, что Cosmos вызывает код ошибки 429.
В Cosmos DB действительно есть параметр, в котором вы можете указать пропускную способность, и по умолчанию он равен 1000 RU/ сек (количество запросов в секунду). Скорее всего, вы превышаете это значение по умолчанию, и Azure говорит вам "остановиться", возвращая код ошибки 429.
Обратитесь к этой документации для получения дополнительной информации об этом параметре и его настройке https://docs.microsoft.com/en-us/azure/cosmos-db/request-units