Azure Cosmos DB客户端引发“HttpRequestException:试图以其访问权限所禁止的方式访问套接字

e0uiprwp  于 2023-08-07  发布在  其他
关注(0)|答案(3)|浏览(120)

我在Azure持久函数中使用了ASP.NET Core 3.1中 SDK Microsoft.Azure.Cosmos 3.28.0 中的CosmosClient。这个客户端正在从我的cosmos示例(Core(SQL))获取和发送数据,它工作正常,但我看到它在HTTP请求元数据时不断抛出异常

获取169.254.169.254/metadata/instance

  • System.Net.Http.HttpRequestException:试图以访问权限所禁止的方式访问套接字。*

我使用以下配置:

private static void RegisterCosmosDbClient(ContainerBuilder builder)
        {
            builder.Register(c => new SocketsHttpHandler()
            {
                PooledConnectionLifetime = TimeSpan.FromMinutes(10), // Customize this value based on desired DNS refresh timer
                MaxConnectionsPerServer = 20, // Customize the maximum number of allowed connections
            }).As<SocketsHttpHandler>().SingleInstance();

            builder.Register(
                    x =>
                    {
                        var cosmosDbOptions = x.Resolve<CosmosDbOptions>();
                        var socketsHttpHandler = x.Resolve<SocketsHttpHandler>();
                        return new CosmosClient(cosmosDbOptions.ConnectionString, new CosmosClientOptions()
                        {
                            ConnectionMode = ConnectionMode.Direct,
                            PortReuseMode = PortReuseMode.PrivatePortPool,
                            IdleTcpConnectionTimeout = new TimeSpan(0, 23, 59, 59),
                            SerializerOptions = new CosmosSerializationOptions()
                            {
                                PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
                            },
                            HttpClientFactory = () => new HttpClient(socketsHttpHandler, disposeHandler: false)
                        });
                    })
                .AsSelf()
                .SingleInstance();
   }

字符串
我也尝试了传递IHttpClientFactory from this blog的方法,但没有帮助。

n7taea2i

n7taea2i1#

看起来您的环境中没有新的套接字可用,因此您会收到套接字禁止错误。请查看如何管理Azure Cosmos DB客户端的连接,您应该在应用程序的生命周期内使用单一Azure Cosmos DB客户端来解决此问题。如果你仍然面临使用单例对象的问题,那么请让我知道,这样我们就可以进一步审查它。

5ssjco0h

5ssjco0h2#

该特定IP和路径用于https://learn.microsoft.com/azure/virtual-machines/windows/instance-metadata-service?tabs=windows
SDK正在尝试检测Azure信息。这可能意味着对于持久功能,此信息和端点不可用。
这不会影响SDK操作,也不会阻止您在CosmosClient示例上执行其他操作。

oug3syen

oug3syen3#

我在Azure之外调用CosmosDb时遇到了这个问题,并发现这很烦人。
如果您真的想禁用此调用,可以禁用,但需要注意在外部库上使用反射的一般注意事项。

var assembly = Assembly.GetAssembly(typeof(CosmosClient));
    var type = assembly?.GetType("Microsoft.Azure.Cosmos.Telemetry.VmMetadataApiHandler");
    var field = type?.GetField("isInitialized", BindingFlags.Static | BindingFlags.NonPublic);
    field?.SetValue(type, true);

字符串
参考:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/ebd1b91a26547721ef232ef597d878144889b80b/Microsoft.Azure.Cosmos/src/Telemetry/VmMetadataApiHandler.cs#L29

相关问题