You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 4.7.2连接Azure Cosmos DB报错,是否兼容该版本?

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:11:24