Singleton httpclient 与创建新的 httpclient 请求

2024-01-28

我正在尝试使用 HttpClient 在我的网络服务中创建层Xamarin.Forms移动应用。

  1. 没有单例模式
  2. 具有单例模式

in first方法我在每个新请求中创建新的http客户端对象 通过移动应用程序。

这是我的代码

  public HttpClient GetConnection()
        {

            HttpClient httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri(baseAddress); 
            httpClient.Timeout = System.TimeSpan.FromMilliseconds(timeout);


            return httpClient;

        }

发布请求代码

 public async Task<TResult> PostAsync<TRequest, TResult>(String url, TRequest requestData)
        {
            HttpClient client = GetConnection();
            String responseData = null;
            if (client != null)
            {

                String serializedObject = await Task.Run(() => JsonConvert.SerializeObject(requestData, _jsonSerializerSettings));
                var jsonContent = new StringContent(serializedObject, System.Text.Encoding.UTF8, "application/json");
                HttpResponseMessage response = await client.PostAsync(new Uri(url, UriKind.Relative), jsonContent);
                responseData = await HandleResponse(response);


                return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _jsonSerializerSettings));


            }
            else
            {

                throw new NullReferenceException("NullReferenceException @ PostAsync  httpclient is null WebRequest.cs");

            }

        }

客户端将使用以下代码来执行请求

new LoginService(new WebRequest()).UserLogin(userRequest);

在实现的类内部IWebRequest

_webRequest.PostAsync<UserRequest,bool>(Constants.USER_LOGIN, userRequest);

in second方法我在每个新请求中重用相同的http客户端对象 在这里,我的单例类也是线程安全的。

private static readonly Lazy<HttpService> lazy =
        new Lazy<HttpService>(() => new HttpService());

        public static HttpService Instance { get { return lazy.Value; } }



        private HttpClient getConnection()
        {

            client = new HttpClient();
            client.Timeout = System.TimeSpan.FromMilliseconds(timeout);

            //client.MaxResponseContentBufferSize = 500000;
            client.BaseAddress = new Uri(baseAddress);
            return client;
        }

发布请求代码

public Task<HttpResponseMessage> sendData(String url,String jsonData)
        {

            var jsonContent = new StringContent(jsonData, System.Text.Encoding.UTF8, "application/json");

            return getConnection().PostAsync(new Uri(url, UriKind.Relative), jsonContent);
        }

客户端将使用以下代码来执行

HttpService.Instance.sendData(...)

我浏览过很多图书馆,比如RestSharp通过网络只是为了探索最好的,我发现他们中的大多数人都在根据请求创建新对象。所以我很困惑哪种模式最适合。


Update:似乎使用单个静态实例HttpClient 不尊重 DNS 更改 http://byterot.blogspot.com/2016/07/singleton-httpclient-dns.html,所以解决方案是使用HttpClientFactory. See here https://learn.microsoft.com/en-us/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests有关它的 Microsoft 文档。

要使用HttpClientFactory你必须使用微软的依赖注入。这是 ASP.NET Core 项目的默认设置,但对于其他项目,您必须引用Microsoft.Extensions.Http and Microsoft.Extensions.DependencyInjection.

然后,当您创建服务容器时,您只需调用AddHttpClient():

var services = new ServiceCollection();
services.AddHttpClient()
var serviceProvider = services.BuildServiceProvider();

然后就可以注入了IHttpClientFactory进入您的服务以及幕后HttpClientFactory将维护一个池HttpClientHandler对象 - 保持您的 DNS 新鲜并防止出现问题连接池耗尽 https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/.


旧答案:

Singleton才是正确的使用方式HttpClient。请参见this https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/文章了解完整详细信息。

微软docs https://learn.microsoft.com/en-gb/dotnet/api/system.net.http.httpclient?view=netframework-4.7.1 state:

HttpClient 旨在实例化一次并在应用程序的整个生命周期中重复使用。为每个请求实例化 HttpClient 类将耗尽重负载下可用的套接字数量。这将导致 SocketException 错误。下面是正确使用 HttpClient 的示例。

事实上,我们在我们的应用程序中发现了这一点。我们的代码可能会在一个进程中发出数百个 API 请求foreach循环,对于每次迭代我们都创建一个HttpClient包裹在一个using。我们很快就开始从我们的系统中收到转移注意力的错误MongoClient说尝试连接数据库超时。阅读链接的文章后,我们发现即使在处理后HttpClient,并意识到我们正在耗尽可用的套接字。

唯一要注意的是,像这样的事情DefaultRequestHeaders and BaseAddress将应用于使用 HttpClient 的任何地方。作为单例,这可能贯穿整个应用程序。您仍然可以创建多个HttpClient实例,但请注意,每次创建时,它们都会创建一个新的连接池,因此应谨慎创建。

正如 hvaughan3 所指出的,您也无法更改HttpMessageHandler由 HttpClient 使用,因此如果这对您很重要,则需要对该处理程序使用单独的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Singleton httpclient 与创建新的 httpclient 请求 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • Android / Java:检查 url 是否是有效的 youtube url

    我想检查一个网址是否是有效的 YouTube 网址 以便我可以在视图中显示 否则我将隐藏视图 Java中有没有正则表达式可以帮助我检查url是否有效 目前我正在使用这个正则表达式 但我想它不是我想要的 String youTubeURl h
  • 为什么 NHibernate 需要将不可设置的成员设为虚拟?

    NHibernate 不仅要求域的可设置属性是虚拟的 而且还要求仅获取属性和方法 有谁知道这是什么原因 我无法想象可能的用途 原因是延迟加载 为了使延迟加载成为可能 创建了代理类 它must拦截来自 外部 的每个调用 以便在执行实际方法 属
  • 在 SQL Server 中创建和修改的序列号

    我需要向应用程序中的大多数实体添加序列号 因为我将并行运行 Lucene 搜索索引 我不需要运行持续的轮询过程 或者通过我的应用程序手动运行我的索引器 我正在考虑以下内容 Add a Created默认值为GETUTCDATE Add a
  • 如何验证 DataRow 对象中是否存在该列?

    private int EmploymentID get set private void MapFields DataRow row if row HasError EmploymentID Convert ToInt32 row Emp
  • React:为什么页面刷新时 state 或 props 为 null?

    我在页面的左框架上显示树视图 树是从 xml 文件生成的 单击每个节点时 组件将在页面的右侧框架中打开 ProductsTreeView 是树组件 Add Category 是单击树节点之一时将打开的组件 我通过路由传递道具 只要页面不刷新
  • 获取 BLE 设备的响应

    我对使用蓝牙设备还很陌生 到目前为止一切都很完美 但有一个问题我不知道如何处理 我有一个 LED 灯设备 我可以改变一切 从颜色到速度 闪烁 褪色等等 现在我想读取当前的设备状态 例如设备是打开还是关闭 我有一份该设备的文件 上面写着 询问
  • KLT 在 OpenCV 中如何工作?

    我很好奇 openCV 中 KLT 背后的逻辑 据我所知 OpenCV中发送的用于寻找光流的图像首先被转换为灰度 我很好奇的是 在运行算法时 我们需要一组用于计算的特征 openCV中求光流法有哪些特点 谢谢 光流有两种类型 密与疏 密集查
  • 使用标准的类型错误

    我阅读了文档和一些讨论该包的文章 但我是 Haskell 的新手 不太了解 但我尝试过 以下是我所做的 module Main where LANGUAGE BangPatterns import Control Parallel par
  • 性能计数器类别名称? (C#)

    我正在尝试将性能计数器编程到我的 C 应用程序中 该应用程序启动另一个进程并检查该启动进程的处理器使用情况 据我了解 性能计数器类要求我分配类别名称 计数器名称和进程名称 我可以很容易地获得进程名称 但是互联网上是否有某种列表包含我可以分配
  • Xcode Playground 上的 SwiftUI 和 foreach 问题

    我试图在 SwiftUI 中执行一个简单的代码 但它显示错误 执行被中断 原因 信号 SIGABRT 这是一个代码 struct ContentView View let data 1 100 map Item 0 let columns
  • 如何在 Mac Excel 2011 上创建 Web 查询?

    我正在尝试从工作表上的网站导入数据 但是当我单击从新数据库查询导入数据时 它显示错误 未安装 Microsoft Query 我到处搜索但找不到解决方案 请帮帮我 Mac 上的过程有点不同 在 Finder 中 转到 Application
  • 带边框的材质设计按钮

    我知道如何制作带有颜色填充的材料设计按钮 style style Widget AppCompat Button Colored 还有无边框透明按钮 style style Widget AppCompat Button Borderles
  • Android Studio 中的 Javadoc @link 引用

    我正在尝试使用 Android Studio 生成一些 Javadoc 我指的是 link method 与链接在同一类中的方法 但我仍然得到reference not found来自 Javadoc 的错误 我可能遗漏了一些非常愚蠢的东西
  • MongoDB - 聚合 ObjectId 上的 $match

    我有一个如下所示的架构 var mongoose require mongoose module exports mongoose model Owner username String blocks type mongoose Schem
  • file_get_contents 处理错误的好方法[重复]

    这个问题在这里已经有答案了 我正在尝试错误处理 file get contents 方法 因此即使用户输入了错误的网站 它也会回显错误消息 而不是不专业的信息 警告 file get contents sidiowdiowjdiso 无法打
  • iPhone 应用程序中的文档文件编辑[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人请建议我如何在 iPhone iPad 应用程序中编辑 Word 文档 我不会在我的应用程序中打开Word文档并更改字体样式和颜色并再
  • 关于应用层和数据库层之间的身份验证的意见

    我对一个技术困境感到困惑 我们团队中的两个人推荐了两种不同的安全模型 每种模型都有优点和缺点 绿地看起来像这样 我们有一个 ASP NET Web 应用程序 与业务层对话 与数据库对话 需求之一是能够让更高级别的用户将业务层权限委托给其他用
  • 从 jpeg 中删除文本

    我有一个包含 alpha 混合文本的 jpeg 知道字体和大小后 我推导出一个代表文本的 png 文件 使用 ImageMagick 我可以获得原始图片的近似值吗 实现此目的的一种方法是使用一种称为修复的技术 您可以在 Python Ski
  • 了解 iOS 崩溃 [SIGABRT ABORT]

    我刚刚收到来自 Crashlytics 的第一份崩溃报告 并正在尝试纠正该问题 不幸的是 它只包含一行在旧设备上运行的代码 因此我无法在 iPhone 6 上测试它 Crashlytics 的崩溃报告突出显示了两个线程 第一个内容如下 Fa
  • Singleton httpclient 与创建新的 httpclient 请求

    我正在尝试使用 HttpClient 在我的网络服务中创建层Xamarin Forms移动应用 没有单例模式 具有单例模式 in first方法我在每个新请求中创建新的http客户端对象 通过移动应用程序 这是我的代码 public Htt