我在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的方法,但没有帮助。
3条答案
按热度按时间n7taea2i1#
看起来您的环境中没有新的套接字可用,因此您会收到套接字禁止错误。请查看如何管理Azure Cosmos DB客户端的连接,您应该在应用程序的生命周期内使用单一Azure Cosmos DB客户端来解决此问题。如果你仍然面临使用单例对象的问题,那么请让我知道,这样我们就可以进一步审查它。
5ssjco0h2#
该特定IP和路径用于https://learn.microsoft.com/azure/virtual-machines/windows/instance-metadata-service?tabs=windows
SDK正在尝试检测Azure信息。这可能意味着对于持久功能,此信息和端点不可用。
这不会影响SDK操作,也不会阻止您在CosmosClient示例上执行其他操作。
oug3syen3#
我在Azure之外调用CosmosDb时遇到了这个问题,并发现这很烦人。
如果您真的想禁用此调用,可以禁用,但需要注意在外部库上使用反射的一般注意事项。
字符串
参考:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/ebd1b91a26547721ef232ef597d878144889b80b/Microsoft.Azure.Cosmos/src/Telemetry/VmMetadataApiHandler.cs#L29