我有一个 Azure 函数应用程序,其中运行着多个函数。如果多个查询最终同时运行,我会从 DocumentQuery 代码的深处得到一个 InvalidCastException 异常。如果我禁用除单个功能之外的所有功能(无论是哪个功能),则不会发生错误,使我相信存在某种共享内存问题。
我已经删除了除有问题的查询之外的所有内容,以尝试隔离问题,确认问题确实源于 >1 对 cosmos 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 DB 扩展版本。我正在创建一个 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;
最佳答案
这是回归。这是跟踪问题 https://github.com/Azure/Azure-Functions/issues/1201 。请pin Functions Runtime version至 2.0.12382
关于c# - 多个异步 Cosmos DB 查询导致 "InvalidCastExceptions",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55814942/