gpt4 book ai didi

c# - 具有多个 api 和查询字符串的 mvc.net 核心 Web 应用程序中的 httpclient 重用

转载 作者:太空宇宙 更新时间:2023-11-03 12:13:58 24 4
gpt4 key购买 nike

我已经阅读了很多关于此的相互矛盾的答案,但仍然没有弄清楚。我有一个 .net core 1.1 web 应用程序,它为各种数据源提供了大量外部 api。我当前的实现使用 DI 将自定义“webclient”类传递给每个 Controller ,它在内部为每个请求创建并配置一个 httpclient(在 using block 内)。我在服务器上看到大量空闲连接,所以我很确定这是造成这些连接的原因。我还遇到了 .net 核心应用程序崩溃和不再响应的一些问题,所以我想知道是否打开的连接太多导致了这个问题。

我意识到 httpclient 可以重复用于许多连接,但我不清楚有几件事。我读过,由于 Web 请求的并行性质,重用相同的 httpclient 对于胖客户端应用程序确实更有用,而对于 Web 应用程序则没有那么有用。我还了解到您想要缓存相同的 httpclient 以供不同的 URL 重用,但是我的 url 使用查询字符串来传递参数,所以这是否意味着每个完全限定的 URL 都是独一无二的?

我的想法是可能为我正在访问的 api 的每个基本域名缓存一个 httpclient 实例,但我还没有找到确认这是否会带来我正在寻找的使用单个 httpclient 实例的好处.我假设我的目标是重用空闲连接,这会实现吗?

我还遇到了一个与我正在做的类似的解决方案的引用,该解决方案将缓存这些实例,然后检查它们中的任何一个是否已在某个时候被处置并根据需要重新创建它们。

看起来这应该是简单的事情,但那里有大量相互矛盾的信息!

最佳答案

HttpClient 可能在应用程序的生命周期内或更长时间内保持打开状态,即使它确实实现了 IDisposable。因此,使用单个 HttpClient 实例是正确的,因为可以保证在任何时候只打开一个连接。

.NET Core 具有用于 DI 的辅助函数。如果您使用以下内容,您的 webclient 的单例实例将被注入(inject)到所有使用它的类中。这意味着每个类都将使用相同的 webclient 对象实例,因此使用相同的 httpclient。

在您的 startup.cs ConfigureServices 函数中使用以下内容:

services.AddSingleton<IWebClient>(new webclient(params));    

services.AddSingleton<IWebClient, webclient>();

Singleton lifetime services are created the first time they're requested (or when ConfigureServices is run if you specify an instance there) and then every subsequent request will use the same instance. If your application requires singleton behavior, allowing the services container to manage the service's lifetime is recommended instead of implementing the singleton design pattern and managing your object's lifetime in the class yourself.

Microsoft documentation for DI in .NET Core

关于c# - 具有多个 api 和查询字符串的 mvc.net 核心 Web 应用程序中的 httpclient 重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com