【问题标题】:Multiple asynchronous Cosmos DB queries resulting in "InvalidCastExceptions"导致“InvalidCastExceptions”的多个异步 Cosmos DB 查询
【发布时间】:2019-04-23 15:45:21
【问题描述】:

我有一个 Azure 函数应用,其中运行着多个函数。如果多个查询最终同时运行,我会从 DocumentQuery 代码的深处得到一个 InvalidCastException。如果我禁用除单个功能以外的所有功能(不管是哪个功能),则不会发生错误,这让我相信存在某种共享内存问题。

除了有问题的查询之外,我已删除所有内容以尝试隔离问题,确认问题确实源于对 cosmos Db 的 >1 次异步调用。

如果我在评估另一个查询时调用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;

【问题讨论】:

标签: c# azure azure-functions azure-cosmosdb


【解决方案1】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多