.NET 4.7.2连接Azure Cosmos DB报错,是否兼容该版本?
兼容性说明
.NET 4.7.2完全兼容Azure Cosmos DB,不管是v3版本的Microsoft.Azure.Cosmos SDK还是v2版本的Microsoft.Azure.DocumentDB.Core SDK,都官方支持该.NET Framework版本。
异常分析
你遇到的The type initializer for 'Microsoft.Azure.Documents.UserAgentContainer' threw an exception间歇性异常,根源在于SDK内部生成用户代理字符串的逻辑出现初始化竞争,或是系统环境中获取运行时信息(如OS版本、.NET版本)时出现不稳定。两种SDK版本抛出相同异常,说明问题和SDK版本关联度低,更多是初始化逻辑或环境的问题。
解决办法
1. 修复CosmosClient的错误初始化方式(v3 SDK)
你的v3代码中存在重复初始化CosmosClient的错误,且CosmosClient设计为单例对象,不应频繁创建。修正后的代码示例:
public class CosmosService { private readonly CosmosClient _client; private string databaseId = "xxx"; private string accountContainer = "Accounts"; private string contactTable = "Contacts"; private string companyTable = "Companies"; private Container container { get => _client.GetDatabase(databaseId).GetContainer(accountContainer); } // 推荐单例初始化,避免重复创建 public CosmosService() { var clientOptions = new CosmosClientOptions() { SerializerOptions = new CosmosSerializationOptions() { PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase }, // 显式设置应用名称,替代自动生成的UserAgent部分 ApplicationName = "YourAppName" }; // 只初始化一次CosmosClient,二选一即可 _client = new CosmosClient(connectionString: connectionStrings, clientOptions); // _client = new CosmosClient(accountEndpoint: "endpoint", authKeyOrResourceToken: "primarykey", clientOptions); } }
2. 显式配置ConnectionPolicy(v2 SDK)
在v2 SDK中,显式指定ConnectionPolicy的UserAgent,绕过自动生成逻辑:
public CosmosService() { var connectionPolicy = new ConnectionPolicy(); // 自定义UserAgent,避免SDK自动初始化UserAgentContainer时出错 connectionPolicy.UserAgentSuffix = "YourAppName/.NET4.7.2"; using (var client = new DocumentClient(new Uri("endpoint"), "primaryKey", connectionPolicy)) { IDocumentQuery<AccountModel> query = client.CreateDocumentQuery<AccountModel>( UriFactory.CreateDocumentCollectionUri(databaseId, accountContainer), new FeedOptions { MaxItemCount = -1 }).AsDocumentQuery(); } }
3. 确保SDK初始化无并发冲突
如果你的应用是多线程环境(如Web应用、多线程服务),要保证CosmosClient/DocumentClient的初始化是线程安全的单例模式,避免多个线程同时触发SDK内部的静态类初始化,导致竞争异常。
4. 更新SDK到稳定版本
- 对于v3 SDK:升级到最新的支持.NET Framework的版本(可查看NuGet包详情确认兼容版本)
- 对于v2 SDK:升级到2.21.0(v2的最终稳定版本),修复了早期版本中的部分初始化问题
异常堆栈信息
at Microsoft.Azure.Documents.UserAgentContainer..ctor()
at Microsoft.Azure.Documents.Client.ConnectionPolicy..ctor()
at Microsoft.Azure.Documents.Client.ConnectionPolicy.get_Default()
at Microsoft.Azure.Documents.Client.DocumentClient.Initialize(Uri serviceEndpoint, ConnectionPolicy connectionPolicy, Nullable1 desiredConsistencyLevel, HttpMessageHandler handler, ISessionContainer sessionContainer, IStoreClientFactory storeClientFactory) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, EventHandler1 sendingRequestEventArgs, ConnectionPolicy connectionPolicy, Nullable1 desiredConsistencyLevel, JsonSerializerSettings serializerSettings, ApiType apitype, EventHandler1 receivedResponseEventArgs, HttpMessageHandler handler, ISessionContainer sessionContainer, IStoreClientFactory storeClientFactory, SecureString secureAuthKey, Func2 transportClientHandlerFactory) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable1 desiredConsistencyLevel)
at HighRoad.CosmosDb.CosmosService..ctor() in C:\Work\05_PlusConnector\CosmosDb\CosmosService.cs:line 36
at PlusConnector.main.Main(String[] args) in C:\Work\05_PlusConnector\PlusConnector\code\Main.cs:line 35
内容的提问来源于stack exchange,提问作者Timo

