Несколько асинхронных запросов к базе данных Cosmos, приводящих к «InvalidCastExceptions» - PullRequest
1 голос
/ 23 апреля 2019

У меня есть приложение-функция Azure с несколькими выполняющимися в нем функциями.Если несколько запросов выполняются одновременно, я получаю исключение InvalidCastException из глубины кода DocumentQuery.Если я отключу все функции, кроме одной (неважно, какая), ошибка не возникнет, что заставит меня поверить, что происходит какая-то проблема с общей памятью.

Я удалил все, за исключениемпроблемных запросов, чтобы попытаться изолировать проблему, подтверждая, что проблема действительно связана с> 1 асинхронными вызовами в космос. Db.

Проблема возникает, если я вызываю DocumentQuery.ToString() или await DocumentQuery.ExecuteNextAsync(), пока другой запросоценивается.В частности, все проблемы возникают здесь:

public static async Task<List<T>> ToListAsync<T>(this IQueryable<T> source, QueryCase queryCase = QueryCase.CamelCase) where T : class
{
    var results = new List<T>();
    IDocumentQuery<T> documentQuery = source.ChangeCase(queryCase).AsDocumentQuery();

    while (documentQuery.HasMoreResults)
    {
        FeedResponse<T> queryResult = await documentQuery.ExecuteNextAsync<T>();
        results.AddRange(queryResult);
    }

    return results;
}

, что ChangeCase() функция вызывает DocumentQuery.ToString(), и она не будет работать там, и если я удаляю это, сбой произойдет на ExecuteNextAsync()

Трассировка стека:

System.InvalidCastException
  HResult=0x80004002
  Message=Unable to cast object of type 'Newtonsoft.Json.Converters.StringEnumConverter' to type 'Newtonsoft.Json.JsonConverter'.
  Source=Microsoft.Azure.DocumentDB.Core
  StackTrace:
   at Microsoft.Azure.Documents.Linq.ExpressionToSql.ApplyCustomConverters(Expression left, SqlLiteralScalarExpression right)
   at Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitBinary(BinaryExpression inputExpression, TranslationContext context)
   at Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitScalarExpression(Expression inputExpression, TranslationContext context)
   at Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitScalarLambda(Expression inputExpression, TranslationContext context)
   at Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitWhere(ReadOnlyCollection`1 arguments, TranslationContext context)
   at Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitMethodCall(MethodCallExpression inputExpression, TranslationContext context)
   at Microsoft.Azure.Documents.Linq.ExpressionToSql.Translate(Expression inputExpression, TranslationContext context)
   at Microsoft.Azure.Documents.Linq.ExpressionToSql.TranslateQuery(Expression inputExpression)
   at Microsoft.Azure.Documents.Linq.SqlTranslator.TranslateQuery(Expression inputExpression)
   at Microsoft.Azure.Documents.Linq.DocumentQueryEvaluator.HandleMethodCallExpression(MethodCallExpression expression)
   at Microsoft.Azure.Documents.Linq.DocumentQueryEvaluator.Evaluate(Expression expression)
   at Microsoft.Azure.Documents.Linq.DocumentQuery`1.ToString()
   at Api.Data.Extensions.DocumentDBLinqExtensions.ChangeCase[T](IQueryable`1 query, QueryCase queryCase) in C:\Users\jason\source\repos\HeroPlatform\HeroPlatform\Api.Data\Extensions\DocumentDbLinqExtensions.cs:line 138

РЕДАКТИРОВАТЬ: я обнаружил, что удаление [JsonConverter(typeof(StringEnumConverter))] из верхней части перечисления, которое я использую в запросе, устраняет ошибку (хотя теперь мои данные пытаются запросить перечисления с помощьючисло вместо строки).

На самом деле мне кажется, что в любом проекте решения не добавлена ​​версия расширения для БД cosmos.Я создаю IServiceCollection и снабжаю его следующим DocumentClient:

new DocumentClient(
        new Uri(configuration["DocumentDb:EndpointUri"]),
        configuration["DocumentDb:Key"],
        serializerSettings: GlobalJson.SerializerSettings(),
        connectionPolicy: new ConnectionPolicy()
        {
            MaxConnectionLimit = 100,
            ConnectionMode = ConnectionMode.Direct,
            ConnectionProtocol = Protocol.Tcp,
        }))

GlobalJson.SerializerSettings ()

var serializerSettings = new JsonSerializerSettings
            {
                ContractResolver = new CamelCaseExceptDictionaryKeysResolver(),
                DateFormatHandling = DateFormatHandling.IsoDateFormat,
                DateParseHandling = DateParseHandling.DateTimeOffset,
                DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
            };
            serializerSettings.Converters.Add(new StringEnumConverter());

            return serializerSettings;

1 Ответ

1 голос
/ 23 апреля 2019

Это регрессия.Вот проблема отслеживания https://github.com/Azure/Azure-Functions/issues/1201.Пожалуйста контактный Функции Runtime версии до 2.0.12382

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...