【发布时间】:2020-01-03 10:09:44
【问题描述】:
当有多个客户端(公司)使用 ASP.NET Core 应用程序并且必须在每个公司的 ASP.NET 应用程序中维护具有相应客户端证书的单独 HttpClient 实例时,最佳应用程序设计是什么?
首先,关于应用程序的一些重要事实:
- 这是一个 ASP.NET Core 3.1 应用程序。
- 使用此 ASP.NET Core 应用程序的每个公司都需要先上传自己的客户端证书 在注册期间。证书和相应的密码是 存储在数据库中。通信需要证书 与一些必须代表代表通知的外部 Web 服务 该公司在 提到了 ASP.NET Core 应用程序。换句话说,对于某些动作 公司在 ASP.NET Core 应用程序中执行,一些外部 web 必须使用 POST 方法和相应的正文通知服务和 必须处理并返回其响应。
- 注册后, 公司可以开始向上述 ASP.NET Core 发送请求 应用。此 ASP.NET Core 应用程序应获取 数据库中对应的公司证书,创建 HttpClient 对象并为其添加证书,准备请求数据并调用外部 Web 服务 通知。那么来自这个外部网络服务的响应应该是 处理并作为对原始公司请求的响应而返回。
- 当然,可以有来自不同公司的同时请求,但也可以同时来自不同公司办公室的同一公司的请求 - 来自同一公司的所有请求都使用相同的公司客户证书,但请求数据( body) 通知外部网络服务总是不同的。
据我所知,为每次调用外部 Web 服务创建新的 HttpClient 对象并不是最佳做法。我考虑过 HttpClientFactory,但在我的情况下,每个 HttpClient 对象都必须包含公司的相应客户端证书。我知道 ASP.NET Core 支持命名 HttpClient 来为每个公司维护单独的 HttpClient,但是 AFAIK 这个命名客户端只能在 Startup 类中创建。这还不够,因为可以在 ASP.NET 应用程序运行时随时注册新公司,公司可以在应用程序运行时上传新证书,使现有命名客户端无效等。
我正在考虑为每个公司维护一个包含一个 HttpClient 对象的静态列表。当发起对公司的第一次请求时,会使用相应的客户端证书创建新的 HttpClient 并将其添加到此列表中。对于来自同一公司(或办公室)的所有后续请求,从提到的静态列表中获取相应的 HttpClient 并重用。当然,我必须在公司的 HttpClient 实例上建立一些锁定,以便在来自同一公司的同时请求的情况下它不会中断。我对这种设计的一个担忧是可能有几百家公司,而且这个 http 客户端列表可能很长。
您还有其他想法或建议吗?
【问题讨论】:
-
拥有多个
HttpClients 的问题实际上是内部HttpClientHandler使连接和保持套接字打开。由于您必须新建HttpClientHandler来设置客户端证书,因此将这些实例池化并将它们设置为具有非常短的生命周期可能更有意义,以便它们老化并快速关闭使用的套接字。但总的来说,我觉得这更像是 ASP.NET Core GitHub 的一个问题,因为我不认为HttpClient和HttpClientFactory是在考虑这种用例的情况下开发的。
标签: asp.net-core .net-core dotnet-httpclient