HttpClient:每个套接字地址(协议/网络地址/端口)通常只允许使用一次

问题描述 投票:0回答:1

我有一个应用程序(ASP NET .NET Framework)正在向我的 API(.net Framework Web API)发送 HTTP 请求(调用),有时我会遇到这样的错误 - 每个套接字地址(协议/网络地址/端口)通常是允许的。我检查了 netstat 并发现 HttpClient 经常打开连接而不关闭连接,因此每次打开连接以及连接限制已过期时,都会出现该错误。

我在开发/测试和生产环境中看到了错误。但是本地运行没发现错误。

代码示例: 这是对 API 的调用,其中 mainClient() 是一个创建 httpClient 的函数

    internal static void DeleteWorkflowDocument(int workflowId, int tableid)
    {
        HttpResponseMessage responseMessage = mainClient().PostAsync("/api/Workflow/DeleteWorkflowDocument?workflowId=" + workflowId + "&tableid=" + tableid, null).Result;
    }

这是 HttpClient 函数

 public static HttpClient mainClient()
    {
        try
        {
            HttpClient newMainClient = new HttpClient();
            newMainClient.BaseAddress = new Uri(System.Configuration.ConfigurationManager.AppSettings["APIURI"]);
            newMainClient.DefaultRequestHeaders.Accept.Clear();
            newMainClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            newMainClient.Timeout = TimeSpan.FromMinutes(10);

            if (HttpContext.Current.Request.Cookies["token__"] != null)
            {
                newMainClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + HttpContext.Current.Request.Cookies["token__"].Value.ToString());
            }
            return newMainClient;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

here as you see only one refresh is adding a huge count of connections and not closing connections

c# .net httpclient netstat
1个回答
0
投票

问题源于 HttpClient 不是单例并且每次调用时都会被实例化:

using (HttpClient client = mainClient())
    {

    }
© www.soinside.com 2019 - 2024. All rights reserved.