У меня есть приложение-функция 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;