惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
博客园 - 【当耐特】
M
MIT News - Artificial intelligence
D
Docker
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
月光博客
月光博客
S
SegmentFault 最新的问题
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI

博客园 - Hey,Coder!

微信小程序 web方案实现调音器功能 systemctl slice配置docker最大占用cpu 内存 pipenv环境变量配置 .net8验证码 数据库差异对比工具 docker部署prometheus grafana pgexporter Alertmanager ubuntu24 换源 ssh配置 ubuntu24 Harbor部署 ubuntu24 kvm部署 cockpit web管理界面 .net api代理 Ubuntu 24.04 DMAR IOMMU 报错修复 uniapp iOS App 上架 vs文件软链接 Docker 网络别名 .net8通用中间件处理公共返回值结构 .net环境下OpenTelemetry Body 读取注意事项 jaeger界面显示异常 .net opentelemetry collector jaeger c# opentelemetry 自定义export c# opentelemetry 自定义export c# 生成对象的初始化代码 Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard docker consul registrator 服务自动注册consul 微服务动态扩容
httphelper封装
Hey,Coder! · 2026-06-24 · via 博客园 - Hey,Coder!

restsharp在docker偶发接口调用慢的问题,改用原生Httpclient重写

public class HttpHelperEx : IHttpHelper, IDisposable
{
    private readonly HttpClient _httpClient;

    private readonly JsonSerializerOptions _jsonOptions;

    public HttpHelperEx(double timeout = 30.0)
    {
        SocketsHttpHandler handler = new SocketsHttpHandler
        {
            PooledConnectionLifetime = TimeSpan.FromMinutes(2.0),
            PooledConnectionIdleTimeout = TimeSpan.FromMinutes(1.0),
            MaxConnectionsPerServer = 50,
            UseProxy = false,
            ConnectTimeout = TimeSpan.FromSeconds(5.0)
        };
        _httpClient = new HttpClient(handler)
        {
            Timeout = TimeSpan.FromSeconds(timeout)
        };
        _jsonOptions = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true,
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase
        };
    }

    public TResponse? Post<TResponse>(string url, object request, Dictionary<string, string>? headers = null)
    {
        Dictionary<string, string> headers2 = headers;
        return Task.Run(async delegate
        {
            using HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Post, url)
            {
                Content = JsonContent.Create(request, null, _jsonOptions)
            };
            AddHeaders(httpRequest, headers2);
            using HttpResponseMessage response = await _httpClient.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead);
            response.EnsureSuccessStatusCode();
            if (response.Content.Headers.ContentLength == 0)
            {
                return default(TResponse);
            }

            return await response.Content.ReadFromJsonAsync<TResponse>(_jsonOptions);
        }).GetAwaiter().GetResult();
    }

    public TResponse? Get<TResponse>(string url, Dictionary<string, string>? headers = null)
    {
        Dictionary<string, string> headers2 = headers;
        return Task.Run(async delegate
        {
            using HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Get, url);
            AddHeaders(httpRequest, headers2);
            using HttpResponseMessage response = await _httpClient.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead);
            response.EnsureSuccessStatusCode();
            if (response.Content.Headers.ContentLength == 0)
            {
                return default(TResponse);
            }

            return await response.Content.ReadFromJsonAsync<TResponse>(_jsonOptions);
        }).GetAwaiter().GetResult();
    }

public class HttpHelperEx : IDisposable
{
    private readonly HttpClient _httpClient;
    private readonly JsonSerializerOptions _jsonOptions;

    public HttpHelperEx(double timeout = 30)
    {
        var handler = new SocketsHttpHandler
        {
            // ✅ Docker Ubuntu 6秒问题的根因解决
            //AddressFamily = AddressFamily.InterNetwork,

            PooledConnectionLifetime = TimeSpan.FromMinutes(2),
            PooledConnectionIdleTimeout = TimeSpan.FromMinutes(1),
            MaxConnectionsPerServer = 50,

            UseProxy = false,
            ConnectTimeout = TimeSpan.FromSeconds(5),
        };

        _httpClient = new HttpClient(handler)
        {
            Timeout = TimeSpan.FromSeconds(timeout)
        };

        _jsonOptions = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true,
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase
        };
    }

    /// <summary>
    /// 异步 POST 请求
    /// </summary>
    public async Task<TResponse?> PostAsync<TResponse>(
        string url,
        object request,
        Dictionary<string, string>? headers = null,
        CancellationToken cancellationToken = default)
    {
        using var httpRequest = new HttpRequestMessage(HttpMethod.Post, url)
        {
            Content = JsonContent.Create(request, options: _jsonOptions)
        };

        AddHeaders(httpRequest, headers);

        using var response = await _httpClient.SendAsync(
            httpRequest,
            HttpCompletionOption.ResponseHeadersRead,
            cancellationToken);

        response.EnsureSuccessStatusCode();

        if (response.Content.Headers.ContentLength == 0)
            return default;

        return await response.Content.ReadFromJsonAsync<TResponse>(
            _jsonOptions,
            cancellationToken);
    }

    /// <summary>
    /// 异步 GET 请求
    /// </summary>
    public async Task<TResponse> GetAsync<TResponse>(
        string url,
        Dictionary<string, string> headers = null,
        CancellationToken cancellationToken = default)
    {
        using var httpRequest = new HttpRequestMessage(HttpMethod.Get, url);
        AddHeaders(httpRequest, headers);

        using var response = await _httpClient.SendAsync(
            httpRequest,
            HttpCompletionOption.ResponseHeadersRead,
            cancellationToken);

        response.EnsureSuccessStatusCode();

        if (response.Content.Headers.ContentLength == 0)
            return default;

        return await response.Content.ReadFromJsonAsync<TResponse>(
            _jsonOptions,
            cancellationToken);
    }

    /// <summary>
    /// 同步 POST 请求(通过异步方法实现)
    /// </summary>
    public TResponse Post<TResponse>(
        string url,
        object request,
        Dictionary<string, string> headers = null)
    {
        // 调用异步方法,使用 ConfigureAwait(false) 避免死锁风险
        return PostAsync<TResponse>(url, request, headers)
            .ConfigureAwait(false)
            .GetAwaiter()
            .GetResult();
    }

    /// <summary>
    /// 同步 GET 请求(通过异步方法实现)
    /// </summary>
    public TResponse Get<TResponse>(
        string url,
        Dictionary<string, string> headers = null)
    {
        // 调用异步方法,使用 ConfigureAwait(false) 避免死锁风险
        return GetAsync<TResponse>(url, headers)
            .ConfigureAwait(false)
            .GetAwaiter()
            .GetResult();
    }

    private static void AddHeaders(HttpRequestMessage request, Dictionary<string, string>? headers)
    {
        if (headers == null) return;

        foreach (var header in headers)
        {
            request.Headers.TryAddWithoutValidation(header.Key, header.Value);
        }
    }

    public void Dispose()
    {
    }
}