我有许多通过 HTTP 调用(.NET 5)相互通信的 CRUD API
为避免打开过多的 tcp 连接,我在所有这些服务中通过 DI使用HttpClientFactory 。这很好用,我没有遇到太多通过 HTTP 打开的连接。
但我的 Azure 应用服务仍然抱怨 SNAT 连接太多:
我猜原因是 Azure 服务总线。我的 API 的每次调用都会将事件写入总线。
为此,我在每次调用时创建一个新实例:
await using (ServiceBusClient client = new ServiceBusClient(_serviceBusConnectionString))
{
var messageObject = new { message.Name, message.Body };
var messageJson = JsonConvert.SerializeObject(messageObject);
ServiceBusSender sender = client.CreateSender(_topicName);
await sender.SendMessageAsync(new ServiceBusMessage(messageJson));
}
许多开发人员都在使用这样的 HttpClient(这是个坏主意,请阅读上面的文章中的原因)。HttpClient 的解决方案是 .NET 为此目的提供的 AddHttpClient 方法。
但是 Azure 服务总线呢?没有什么像 AzureServiceBusFactory 这样的东西,将 AzureServiceBus 添加为 Singleton 并不是一个好主意,因为每次调用的配置都应该不同。
如何确保连接池也可用于 Azure 服务总线连接?有没有我错过的最佳实践?还是您认为连接问题有其他原因?
编辑:
公认的答案是正确的。这工作正常,我的错误消失了。只需使用以下内容添加服务总线客户端:
services.AddAzureClients(cfg =>
{
cfg.AddServiceBusClient("your-connection-string");
});
在此之后,您可以在所有服务中通过 DI 轻松获取客户端。