当前位置: 首页 > 知识库问答 >
问题:

单例httpclient与创建新的httpclient请求

柯伟志
2023-03-14
    null

在第一种方法中,我在mobile Applicaiton发出的每个新请求中创建新的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);
_webRequest.PostAsync<UserRequest,bool>(Constants.USER_LOGIN, userRequest);
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(...)

共有1个答案

陆浩博
2023-03-14

更新:使用HttpClient的单个静态实例似乎不尊重DNS更改,因此解决方案是使用HttpClientFactory。请参阅这里的Microsoft文档。

要使用HttpClientFactory,必须使用Microsoft的依赖项注入。这是ASP.NET核心项目的默认值,但对于其他项目,必须引用Microsoft.Extensions.HTTP和Microsoft.Extensions.DependencyInject。

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

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

单例是使用HttpClient的正确方法。请看这篇文章的全部细节。

Microsoft文档状态:

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

 类似资料:
  • 我使用Spring Boot创建了一个服务(微服务设计的一部分)。我有下面的方法, 我多次调用此方法,希望只维护一个实例并在创建后重用它。考虑到并发编程,我可以使用单例模式吗?根据下面的链接,我看到RestTemboard是非常好的方法,而不是Apache Http Client, RestTemplate与ApacheHTTP客户端在spring项目中的生产代码 非常感谢您的建议。

  • 主要内容:Maven依赖关系,HTTP Delete请求方法示例本教程演示如何使用Apache HttpClient 4.5创建Http 请求。 HTTP 请求方法请求删除由URI指定的资源。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache 版本。 将以下依赖项添加到您的项目中,以便创建HTTP 请求方法。 pom.xml 文件的内容如下 - HTTP Delete请求方法示例 在以下示例中,我们将数据发布到资源URL: 。 该资源确

  • 主要内容:Maven依赖关系,HTTP PUT请求方法示例本教程演示如何使用Apache 发出Http PUT请求。 HTTP PUT请求方法请求服务器接受并存储提供的URI中包含的实体。 如果该URI引用已经存在的资源,则该资源被修改; 如果URI不指向现有资源,则服务器可以使用该URI创建资源。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache 版本。 将以下依赖项添加到您的项目中,以便创建HTTP PUT请求方法。 pom.

  • 主要内容:Maven依赖关系,HTTP GET请求方法示例本教程演示如何使用Apache HttpClient 4.5发出Http POST请求。 HTTP POST请求方法请求服务器接受请求中包含的实体作为URI标识的Web资源。 发布的数据可以是但不限于现有资源的注释或数据格式化的JSON,XML或提交的表单数据。 服务器可以使用发布的数据来更新数据库中的资源,或处理这些数据。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache

  • 主要内容:Maven依赖关系,HTTP GET请求方法示例本教程演示如何使用Apache HttpClient 4.5发出Http GET请求。 Http GET方法表示指定资源的表示形式。 这可能与获取HTML页面一样简单,或者使用JSON,XML等格式获取资源。使用HTTP GET请求方法的请求应该是幂等的,这意味着:这些应该只能检索数据并且应该没有其他效果。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache HttpClie

  • 主要内容:Maven依赖关系,HttpRequestRetryHandler示例在以下示例中,我们演示了如何创建自定义以启用自定义异常恢复机制。 当使用这个接口时,需要实现方法。 这使我们能够定义一个自定义的重试计数机制和异常恢复机制。 看看下面的教程是如何实现的。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache HttpClient 4.5版本。 将以下依赖项添加到您的项目中。 pom.xml 文件的内容如下 - HttpRequestRetryH